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

Buona pratica per utilizzare gli indici inversi su chiavi surrogate? (Oracolo)

In generale, se non utilizzi RAC, non ci sarebbe motivo di utilizzare un indice a chiave inversa.

Dal punto di vista delle prestazioni, è molto meglio avere uno o due blocchi caldi in un dato momento soggetti a inserimenti perché ciò garantisce essenzialmente che i blocchi caldi saranno nella cache del buffer e nel INSERT non dovrà sostenere il costo della lettura del blocco dal disco. Se hai inserti che vanno in blocchi casuali in un indice, c'è una probabilità molto maggiore che il blocco che desideri sia invecchiato fuori dalla cache e debba sostenere il costo di un I/O fisico.

Il costo per mantenere un indice bilanciato è piuttosto minimo, ma anche questo favorisce un indice standard. Se hai una chiave primaria generata in sequenza con un indice normale, Oracle eseguirà un Divisione blocco 90/10 sul blocco più a destra quando quel blocco si riempie. Al contrario, se hai un indice di chiave inversa, Oracle deve fare 50/50 suddivisioni in blocchi ogni volta che un determinato blocco si riempie. Una suddivisione in blocchi 50/50 copia metà dei dati dal vecchio blocco al nuovo blocco, una suddivisione in blocchi 90/10 copia solo il valore dei dati più a destra nel nuovo blocco. La divisione in blocchi 90/10, quindi, è molto più economica di una divisione in blocchi 50/50 e dovresti fare all'incirca lo stesso numero di divisioni in blocchi indipendentemente dal tipo di indice scelto. Quindi il costo del mantenimento di un indice regolare è inferiore al costo del mantenimento di un indice della chiave inversa anche ignorando l'effetto della cache.

Il motivo per cui prenderesti in considerazione l'utilizzo di un indice della chiave inversa sarebbe che stai utilizzando RAC e vuoi evitare il costo di avere molti nodi RAC che combattono tutti per lo stesso blocco attivo. Se devi costantemente spedire il blocco caldo da un nodo all'altro per eseguire l'inserimento successivo, potrebbe essere utile utilizzare invece un indice di chiave inversa per ridurre tale contesa. Se hai concesso in licenza l'opzione di partizionamento, sarebbe comunque meglio utilizzare un indice partizionato hash (questo può essere fatto indipendentemente dal fatto che le tabelle siano partizionate o meno). Se non hai concesso in licenza l'opzione di partizionamento, un indice della chiave inversa potrebbe essere abbastanza valido per risolvere i conflitti nell'hot block da non richiedere la licenza del partizionamento.