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

Indice di partizione Oracle

Nell'articolo precedente, abbiamo appreso della tabella partizionata Oracle. In continuazione di quella serie, presenterò qui l'indice di partizione Oracle

Ecco alcuni dei fatti sulla comprensione degli indici partizionati

Indici di partizione locale

  • Viene creato un indice locale su una tabella partizionata in cui l'indice è partizionato esattamente nello stesso modo della tabella partizionata sottostante. Ovvero, l'indice locale eredita il metodo di partizionamento della tabella. Questo è noto come equi-partizionamento.
  • Per gli indici locali, le chiavi dell'indice all'interno dell'indice faranno riferimento solo alle righe archiviate nella singola partizione della tabella sottostante. Un indice locale viene creato specificando l'attributo LOCAL e può essere creato come UNICO o NON UNICO.
  • La tabella e l'indice locale sono partizionati esattamente nello stesso modo o hanno la stessa chiave di partizione perché gli indici locali vengono mantenuti automaticamente e possono offrire una maggiore disponibilità.
  • Poiché il database Oracle assicura che le partizioni di indice siano sincronizzate con le corrispondenti partizioni di tabella, ne consegue che il database mantiene automaticamente la partizione di indice ogni volta che viene eseguita qualsiasi operazione di manutenzione sulle tabelle sottostanti
  • ad esempio, quando le partizioni vengono aggiunte, eliminate o unite.
  • Un indice locale è prefissato se la chiave di partizione della tabella e la chiave di indice sono uguali; altrimenti è un indice locale senza prefisso
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

Indici partizionati globali

  • Un indice partizionato globale è un indice su una tabella partizionata o non partizionata che è partizionata in modo indipendente, ovvero utilizzando una chiave di partizionamento diversa dalla tabella. Gli indici partizionati a livello globale possono essere partizionati in base a intervalli o hash. Gli indici partizionati globali sono più difficili da gestire rispetto agli indici locali. Tuttavia, offrono un metodo di accesso più efficiente a qualsiasi singolo record.
  • Durante l'interazione della tabella o dell'indice durante la manutenzione della partizione, tutte le partizioni in un indice globale saranno interessate.
  • Quando sulla partizione della tabella sottostante sono eseguite operazioni di manutenzione SPLIT, MOVE, DROP o TRUNCATE, sia gli indici globali che gli indici partizionati globali verranno contrassegnati come inutilizzabili. Ne consegue quindi che l'indipendenza della partizione non è possibile per gli indici globali.
  • A seconda del tipo di operazione eseguita su una partizione di tabella, gli indici sulla tabella saranno interessati. Quando si modifica una partizione di una tabella, è possibile specificare la clausola UPDATE INDEXES. Ciò mantiene automaticamente gli indici e le partizioni globali interessati.
  • I vantaggi dell'utilizzo di questa opzione sono che l'indice rimarrà online e disponibile durante tutta l'operazione e non dovrà essere ricostruito una volta completata l'operazione.
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

Indici globali non partizionati

  • Gli indici globali non partizionati offrono lo stesso accesso efficiente a qualsiasi record individuale in qualsiasi partizione e si comportano proprio come un indice non partizionato. Poiché la struttura dell'indice non è partizionata, l'indice è disponibile per tutte le partizioni.
  • Uno scenario in cui questo tipo di indice sarebbe utile è con una query che non include la chiave di partizione della tabella come filtro, ma desideri comunque che Oracle Optimizer utilizzi un indice

Domande frequenti

Che cos'è l'indice con prefisso e senza prefisso?

L'indice è chiamato con prefisso se la o le colonne iniziali nella definizione dell'indice sono (sono) le colonne della chiave di partizione, altrimenti è chiamato senza prefisso.

Possiamo suddividere l'indice globale?

No, non puoi suddividere l'indice globale, ma puoi partizionarlo. L'unico modo per ottenere una sottopartizione dell'indice è avere una tabella sottopartizionata con un indice locale

Come scoprire se un indice è globale o locale

Interrogando la colonna, LOCALITY, in DBA_PART_INDEXES.

Legge anche

  • Esercitazioni sull'amministrazione del database Oracle
  • https://docs.oracle.com/en/database/oracle/oracle-database/18/vldbg/index-partitioning.html#GUID-569F94D0-E6E5-45BB-9626-5506DE18FF00
  • cambia il formato della data in Oracle