sql >> Database teknologi >  >> RDS >> Oracle

Oracle partitionsindeks

I den forrige artikel lærte vi om Oracle partitioneret tabel. I forlængelse af den serie vil jeg her præsentere Oracle-partitionsindekset

Her er nogle af fakta om forståelse af partitionerede indekser

Lokale partitionsindekser

  • Et lokalt indeks på en inddelt tabel oprettes, hvor indekset er opdelt på nøjagtig samme måde som den underliggende inddelte tabel. Det vil sige, at det lokale indeks arver tabellens partitioneringsmetode. Dette er kendt som equi-partitionering.
  • For lokale indekser vil indeksnøglerne i indekset kun referere til de rækker, der er gemt i den enkelte underliggende tabelpartition. Et lokalt indeks oprettes ved at angive attributten LOCAL og kan oprettes som UNIK eller IKKE UNIK.
  • Tabellen og det lokale indeks er enten opdelt på nøjagtig samme måde eller har den samme partitionsnøgle, fordi de lokale indekser vedligeholdes automatisk, kan tilbyde højere tilgængelighed.
  • Da Oracle-databasen sikrer, at indekspartitionerne er synkroniseret med deres tilsvarende tabelpartitioner, følger det, at databasen automatisk vedligeholder indekspartitionen, når der udføres en vedligeholdelseshandling på de underliggende tabeller
  • f.eks. når partitioner tilføjes, slettes eller flettes.
  • Et lokalt indeks er præfikset, hvis partitionsnøglen i tabellen og indeksnøglen er den samme; ellers er det et lokalt indeks uden præfiks
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20))
  PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_1 values less than (10, 100),
  partition EXP_PART_2 values less than (20, 200),
  partition EXP_PART_3 values less than (30, 300),
  partition EXP_PART_4 values less than (40, 400));
 Table created.

 SQL> CREATE INDEX test_idx ON EXP_PART(id, item_id)
  LOCAL
  (partition test_idx_1,
  partition test_idx_2,
  partition test_idx_3,
  partition test_idx_4);
 Index created.

SQL> SELECT index_name, partition_name, status
  FROM user_ind_partitions where index_name='TEST_IDX'
  ORDER BY index_name, partition_name;
 INDEX_NAME PARTITION_NAME STATUS
 ---------   -----------    ------
 TEST_IDX IX_TEST_IDX_1 USABLE
 TEST_IDX IX_TEST_IDX_2 USABLE
 TEST_IDX IX_TEST_IDX_3 USABLE
 TEST_IDX IX_TEST_IDX_4 USABLE

Globale opdelte indekser

  • Et globalt partitioneret indeks er et indeks på en partitioneret eller ikke-partitioneret tabel, der er partitioneret uafhængigt, dvs. ved at bruge en anden partitioneringsnøgle end tabellen. Globale partitionerede indekser kan være range- eller hash-partitionerede. Globale partitionerede indekser er sværere at vedligeholde end lokale indekser. De tilbyder dog en mere effektiv adgangsmetode til enhver individuel post.
  • Under tabel- eller indeksinteraktion under partitionsvedligeholdelse vil alle partitioner i et globalt indeks blive påvirket.
  • Når den underliggende tabelpartition har nogen SPLIT-, MOVE-, DROP- eller TRUNCATE-vedligeholdelsesoperationer udført på den, vil både globale indekser og globale partitionerede indekser blive markeret som ubrugelige. Det følger derfor, at partitionsuafhængighed ikke er muligt for globale indekser.
  • Afhængigt af den type operation, der udføres på en tabelpartition, vil indekserne på tabellen blive påvirket. Når du ændrer en tabelpartition, kan UPDATE INDEXES-udtrykket angives. Dette vedligeholder automatisk de berørte globale indekser og partitioner.
  • Fordelene ved at bruge denne mulighed er, at indekset forbliver online og tilgængeligt under hele operationen og ikke skal genopbygges, når operationen er fuldført.
SQL> CREATE TABLE EXP_PART (id number, item_id number, name varchar2(20))
  PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_1 values less than (10, 100),
  partition EXP_PART_2 values less than (20, 200),
  partition EXP_PART_3 values less than (30, 300),
  partition EXP_PART_4 values less than (40, 400));
 Table created.

 SQL> CREATE UNIQUE INDEX EXP_PART_IDX ON EXP_PART(id, item_id)
  GLOBAL PARTITION BY RANGE (id, item_id)
  (partition EXP_PART_IDX_1 values less than (20, 200),
   partition EXP_PART_IDX_2 values less than (maxvalue, maxvalue));
 Index created.

SQL> SELECT index_name, partition_name, status
  FROM user_ind_partitions where index_name='EXP_PART_IDX'
  ORDER BY index_name, partition_name;
 INDEX_NAME PARTITION_NAME STATUS
 
 EXP_PART_IDX EXP_PART_IDX_1 USABLE
 EXP_PART_IDX EXP_PART_IDX_2 USABLE

Globale ikke-opdelte indekser

  • Globale ikke-opdelte indekser tilbyder den samme effektive adgang til enhver individuel post i enhver partition og opfører sig ligesom et ikke-opdelt indeks. Da indeksstrukturen ikke er opdelt, er indekset tilgængeligt for alle partitioner.
  • Et scenarie, hvor denne type indeks ville være nyttig, er med en forespørgsel, der ikke inkluderer tabellens partitionsnøgle som et filter, men du stadig ønsker, at Oracle Optimizer skal bruge et indeks

Ofte stillede spørgsmål

Hvad er indekset med præfiks og ikke-præfiks?

Indekset kaldes præfiks, hvis den eller de førende kolonne(r) i indeksdefinitionen er partitionsnøglekolonnen(r), ellers kaldes det ikke-præfiks.

Kan vi underopdele det globale indeks?

Nej, du kan ikke underpartitionere globalt indeks, men du kan partitionere det. Den eneste måde at ende op med indeksunderpartition på er at have en underopdelt tabel med lokalt indeks

Sådan finder du, om et indeks er globalt eller lokalt

Ved at forespørge på kolonnen LOCALITY i DBA_PART_INDEXES.

Læser også

  • Oracle-databaseadministrationsvejledning
  • https://docs.oracle.com/da/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
  • ændre datoformat i Oracle


  1. Hvordan man kan forudse og undslippe enkelt citat ' i oracle

  2. Sådan håndteres datoer korrekt i forespørgselsbegrænsninger

  3. Hvorfor ventestatistikker alene ikke er nok

  4. Sådan formateres dato og klokkeslæt i SQL Server