- 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.
- 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.
- 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.
- 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
- compressione Indice
- 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.
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. –
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 ... –