Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Partitionsindex

Im vorherigen Artikel haben wir etwas über die partitionierte Oracle-Tabelle erfahren. In Fortsetzung dieser Serie werde ich hier den Oracle-Partitionsindex vorstellen

Hier sind einige Fakten zum Verständnis partitionierter Indizes

Lokale Partitionsindizes

  • Ein lokaler Index für eine partitionierte Tabelle wird erstellt, wobei der Index genau so partitioniert ist wie die zugrunde liegende partitionierte Tabelle. Das heißt, der lokale Index erbt die Partitionierungsmethode der Tabelle. Dies wird als Gleichpartitionierung bezeichnet.
  • Bei lokalen Indizes beziehen sich die Indexschlüssel innerhalb des Index nur auf die Zeilen, die in der einzelnen zugrunde liegenden Tabellenpartition gespeichert sind. Ein lokaler Index wird durch Angabe des Attributs LOCAL erstellt und kann als UNIQUE oder NON-UNIQUE erstellt werden.
  • Die Tabelle und der lokale Index sind entweder auf genau dieselbe Weise partitioniert oder haben denselben Partitionsschlüssel, da die lokalen Indizes automatisch verwaltet werden, was eine höhere Verfügbarkeit bieten kann.
  • Da die Oracle-Datenbank sicherstellt, dass die Indexpartitionen mit ihren entsprechenden Tabellenpartitionen synchronisiert werden, behält die Datenbank automatisch die Indexpartition bei, wenn Wartungsvorgänge an den zugrunde liegenden Tabellen durchgeführt werden
  • zum Beispiel, wenn Partitionen hinzugefügt, gelöscht oder zusammengeführt werden.
  • Ein lokaler Index wird vorangestellt, wenn der Partitionsschlüssel der Tabelle und der Indexschlüssel gleich sind; andernfalls handelt es sich um einen lokalen Index ohne Präfix
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

Global partitionierte Indizes

  • Ein global partitionierter Index ist ein Index für eine partitionierte oder nicht partitionierte Tabelle, die unabhängig partitioniert ist, d. h. einen anderen Partitionierungsschlüssel als die Tabelle verwendet. Global partitionierte Indizes können Bereichs- oder Hash-partitioniert sein. Global partitionierte Indizes sind schwieriger zu verwalten als lokale Indizes. Sie bieten jedoch eine effizientere Zugriffsmethode auf einzelne Datensätze.
  • Während der Tabellen- oder Indexinteraktion während der Partitionswartung sind alle Partitionen in einem globalen Index betroffen.
  • Wenn auf der zugrunde liegenden Tabellenpartition SPLIT-, MOVE-, DROP- oder TRUNCATE-Wartungsoperationen ausgeführt werden, werden sowohl globale Indizes als auch global partitionierte Indizes als unbrauchbar markiert. Daraus folgt, dass Partitionsunabhängigkeit für globale Indizes nicht möglich ist.
  • Je nach Art der Operation, die auf einer Tabellenpartition ausgeführt wird, sind die Indizes der Tabelle betroffen. Beim Ändern einer Tabellenpartition kann die UPDATE INDEXES-Klausel angegeben werden. Dadurch werden die betroffenen globalen Indizes und Partitionen automatisch verwaltet.
  • Die Vorteile dieser Option bestehen darin, dass der Index während des gesamten Vorgangs online und verfügbar bleibt und nach Abschluss des Vorgangs nicht neu erstellt werden muss.
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 nicht partitionierte Indizes

  • Globale nicht partitionierte Indizes bieten den gleichen effizienten Zugriff auf jeden einzelnen Datensatz in jeder Partition und verhalten sich wie ein nicht partitionierter Index. Da die Indexstruktur nicht partitioniert ist, steht der Index allen Partitionen zur Verfügung.
  • Ein Szenario, in dem diese Art von Index nützlich wäre, ist eine Abfrage, die den Partitionsschlüssel der Tabelle nicht als Filter enthält, aber Sie möchten dennoch, dass der Oracle-Optimierer einen Index verwendet

Häufig gestellte Fragen

Was ist der Index mit und ohne Präfix?

Der Index wird als Präfix bezeichnet, wenn die führende(n) Spalte(n) in der Indexdefinition die Partitionsschlüsselspalte(n) ist (sind), andernfalls wird er als Nicht-Präfix bezeichnet.

Können wir den globalen Index unterteilen?

Nein, Sie können den globalen Index nicht unterteilen, aber Sie können ihn partitionieren. Die einzige Möglichkeit, eine Indexunterpartitionierung zu erreichen, besteht darin, eine unterpartitionierte Tabelle mit lokalem Index zu haben

So finden Sie heraus, ob ein Index global oder lokal ist

Durch Abfragen der Spalte LOCALITY in DBA_PART_INDEXES.

Liest auch

  • Tutorials zur Oracle-Datenbankverwaltung
  • https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
  • Datumsformat in Oracle ändern