2010-02-04 10 views
19

un indice su due colonne può essere creato con una delle dichiarazioniOracle: l'ordine delle colonne è importante in un indice?

create index foo_ix on foo(a,b); 
create index foo_ix on foo(b,a); 
  1. modo incide i (runtime) caratteristiche operative utilizzando l'indice?

  2. In che modo influisce sulle caratteristiche di layout (fisiche) dell'indice?

  3. Sono (1) o (2) interessati dai tipi/dimensioni delle colonne?

  4. Quali sono le migliori pratiche per la creazione di indici a più colonne?

In breve, è importante quale colonna ho inserito per primo?

risposta

19
  1. Se a e b entrambi hanno 1000 valori distinti e sono sempre interrogati insieme poi l'ordine delle colonne nell'indice in realtà non importa. Ma se a ha solo 10 valori distinti o hai query che usano solo una delle colonne, allora importa; in questi scenari l'indice non può essere utilizzato se l'ordinamento della colonna non soddisfa la query.
  2. La colonna con i valori meno distinti deve essere la prima e la colonna con i valori più distinti. Questo non solo massimizza l'utilità dell'indice, ma aumenta anche i potenziali guadagni dalla compressione dell'indice.
  3. Il tipo di dati e la lunghezza della colonna hanno un impatto sul rendimento che possiamo ottenere dalla compressione dell'indice ma non sul miglior ordine di colonne in un indice.
  4. Disporre prima le colonne con la colonna meno selettiva e la colonna più selettiva. Nel caso di un lead lead con la colonna che è più probabile che venga utilizzato da solo.

L'unica eccezione a 2. e 3. è con le colonne DATE. Poiché le colonne Oracle DATE includono un elemento temporale, potrebbero avere 86400 valori distinti al giorno. Tuttavia, la maggior parte delle query su una colonna di dati di solito interessano solo l'elemento del giorno, quindi è possibile considerare solo il numero di giorni distinti nei calcoli. Anche se sospetto che non influenzerà la selettività relativa in una manciata di casi.

di modifica (in risposta al commento di Nick Pierpoint)

Le due ragioni principali per condurre con la colonna almeno selettivo sono

  1. compressione Indice
  2. Indice Skip legge

Entrambi questi funzionano la loro magia dal sapere che il valore nello slot corrente è lo stesso del valore nello slot precedente. Di conseguenza, possiamo massimizzare il ritorno da queste tecniche riducendo al minimo il numero di volte in cui il valore cambia. Nell'esempio seguente, A ha quattro valori distinti e B ha sei. I dittos rappresentano un valore comprimibile o un blocco indice ignorabile.

Least selective column leads ... 

A   B 
--------- - 
AARDVARK 1 
"   2 
"   3 
"   4 
"   5 
"   6 
DIFFVAL 1 
"   2 
"   3 
"   4 
"   5 
"   6 
OTHERVAL 1 
"   2 
"   3 
"   4 
"   5 
"   6 
WHATEVER 1 
"   2 
"   3 
"   4 
"   5 
"   6 

colonna più selettivo conduce ...

B A 
- -------- 
1 AARDVARK 
" DIFFVAL 
" OTHERVAL 
" WHATEVER 
2 AARDVARK 
" DIFFVAL 
" OTHERVAL 
" WHATEVER 
3 AARDVARK 
" DIFFVAL 
" OTHERVAL 
" WHATEVER 
4 AARDVARK 
" DIFFVAL 
" OTHERVAL 
" WHATEVER 
5 AARDVARK 
" DIFFVAL 
" OTHERVAL 
" WHATEVER 
6 AARDVARK 
" DIFFVAL 
" OTHERVAL 
" WHATEVER 

Anche in questo esempio trival, (A, B) ha 20 slot ignorabili rispetto al 18 (B, A). Una disparità più ampia genererebbe un ROI maggiore sulla compressione dell'indice o una migliore utilità dalle letture Skip di indice.

Come nel caso della maggior parte delle euristiche di tuning, è necessario eseguire il benchmark utilizzando valori reali e volumi realistici. Questo è sicuramente uno scenario in cui l'inclinazione dei dati potrebbe avere un impatto drammatico sull'efficacia dei diversi approcci.


"Credo che se si dispone di un primo indice altamente selettivo poi - dal punto di vista delle prestazioni - ti farà bene a metterlo prima."

Se disponiamo di una colonna altamente selettiva, dovremmo creare un indice a parte. È improbabile che i vantaggi aggiuntivi derivanti dall'evitare un'operazione FILTER su una manciata di righe siano superati dall'overhead del mantenimento di un indice composito.

indici più colonne sono più utili quando abbiamo:

  • due o più colonne di selettività semola,
  • che sono frequentemente utilizzati nella stessa query.
+0

Ciao. Non sono chiaro sul tuo punto 4. Puoi spiegare? In generale avrei messo per prima la * selective * column. Metterei per prima cosa solo la colonna meno selettiva quando pensavo che un istogramma potesse utilmente portare il CBO a saltare completamente l'indice. –

+0

Grazie per l'ulteriore modifica di APC: ha reso chiaro il tuo punto di vista. Il tuo commento su quindi bisogno di benchmark è ben fatto. Penso che se hai un primo indice altamente selettivo, dal punto di vista delle prestazioni, farai bene a metterlo per primo. Benchmark ... benchmark ... benchmark ... –

3
  1. se una colonna viene usato da solo in una query Oracle userà un valore meno efficiente saltare accesso indice scansione percorso se non è la colonna iniziale nell'indice
  2. dipende dalla rispettivo selettività le colonne
  3. senza
  4. vorrei guardare le query che coinvolgono le colonne nell'indice e classificare la loro posizione nell'indice da più pesantemente interrogato
4

Ma secondo Oracle sé, è meglio mettere la colonna con la più alta cardinalità prima:

http://docs.oracle.com/cd/B10500_01/server.920/a96533/data_acc.htm#2174

Chiavi di ordinazione per gli indici compositi

Se tutti i tasti sono utilizzati in clausole WHERE altrettanto spesso, quindi l'ordine di queste chiavi dalla più selettiva alla meno selettiva nell'istruzione CREATE INDEX migliora al meglio le prestazioni delle query.

Problemi correlati