La documentazione Oracle contiene un'eccellente serie di considerazioni per le scelte di indicizzazione:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
Aggiornamento per 19c:https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/designing-and-developing-for-performance.html#GUID-99A7FD1B-CEFD-4E91-9486- 2CBBFC2B7A1D
Citando:
-
Prendi in considerazione l'indicizzazione delle chiavi utilizzate frequentemente nelle clausole WHERE.
-
Prendi in considerazione l'indicizzazione delle chiavi utilizzate frequentemente per unire le tabelle nelle istruzioni SQL. Per ulteriori informazioni sull'ottimizzazione dei join, vedere la sezione "Utilizzo dei cluster hash per le prestazioni".
-
Scegli le chiavi di indice che hanno un'elevata selettività. La selettività di un indice è la percentuale di righe in una tabella che hanno lo stesso valore per la chiave indicizzata. La selettività di un indice è ottimale se poche righe hanno lo stesso valore. Nota:Oracle crea automaticamente indici o utilizza indici esistenti sulle chiavi e sulle espressioni di chiavi univoche e primarie definite dall'utente con vincoli di integrità. L'indicizzazione di colonne a bassa selettività può essere utile se la distribuzione dei dati è distorta in modo che uno o due valori si verifichino molto meno spesso di altri valori.
-
Non utilizzare indici B-tree standard su chiavi o espressioni con pochi valori distinti. Tali chiavi o espressioni in genere hanno una scarsa selettività e pertanto non ottimizzano le prestazioni a meno che i valori chiave selezionati di frequente non appaiano meno frequentemente degli altri valori chiave. È possibile utilizzare gli indici bitmap in modo efficace in questi casi, a meno che l'indice non venga modificato frequentemente, come in un'applicazione OLTP ad alta simultaneità.
-
Non indicizzare le colonne che vengono modificate frequentemente. Le istruzioni UPDATE che modificano le colonne indicizzate e le istruzioni INSERT e DELETE che modificano le tabelle indicizzate impiegano più tempo che se non ci fosse un indice. Tali istruzioni SQL devono modificare i dati negli indici così come i dati nelle tabelle. Generano anche ulteriori annullamenti e ripetizioni.
-
Non indicizzare le chiavi che appaiono solo nelle clausole WHERE con funzioni o operatori. Una clausola WHERE che utilizza una funzione, diversa da MIN o MAX, o un operatore con una chiave indicizzata non rende disponibile il percorso di accesso che utilizza l'indice se non con indici basati su funzione.
-
Prendere in considerazione l'indicizzazione delle chiavi esterne dei vincoli di integrità referenziale nei casi in cui un numero elevato di istruzioni INSERT, UPDATE e DELETE simultanee accedono alle tabelle padre e figlio. Tale indice consente AGGIORNAMENTI ed ELIMINA sulla tabella padre senza condividere il blocco della tabella figlio.
-
Quando si sceglie di indicizzare una chiave, considerare se il guadagno di prestazioni per le query vale la perdita di prestazioni per INSERT, UPDATE e DELETE e l'uso dello spazio necessario per archiviare l'indice. Potresti voler sperimentare confrontando i tempi di elaborazione delle istruzioni SQL con e senza indici. Puoi misurare il tempo di elaborazione con la funzione di traccia SQL.