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

Oracle:l'ordine delle colonne è importante in un indice?

  1. Se a e b entrambi hanno 1000 valori distinti e vengono sempre interrogati insieme, quindi l'ordine delle colonne nell'indice non ha molta importanza. Ma se a ha solo 10 valori distinti o hai query che utilizzano solo una delle colonne, quindi importa; in questi scenari l'indice potrebbe non essere utilizzato se l'ordinamento delle colonne non soddisfa la query.
  2. La colonna con i valori meno distinti dovrebbe essere la prima e la colonna con i valori più distinti per ultima. 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 sull'ordine migliore delle colonne in un indice.
  4. Disporre le colonne con la colonna meno selettiva per prima e la colonna più selettiva per ultima. In caso di parità, piombo con la colonna che è più probabile che venga utilizzata da sola.

L'unica potenziale eccezione a 2. e 3. riguarda 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 sono generalmente interessate solo all'elemento giorno, quindi potresti voler considerare solo il numero di giorni distinti nei tuoi calcoli. Anche se sospetto che non influirà sulla selettività relativa in una manciata di casi.

modifica (in risposta al commento di Nick Pierpoint)

I due motivi principali per condurre con la colonna meno selettiva sono

  1. Compressione dell'indice
  2. Indice Salta letture

Entrambi fanno la loro magia sapendo che il valore nello slot corrente è lo stesso del valore nello slot precedente. Di conseguenza possiamo massimizzare il rendimento di queste tecniche riducendo al minimo il numero di volte in cui il valore cambia. Nell'esempio seguente, A ha quattro valori distinti e B ne ha sei. I dittos rappresentano un valore comprimibile o un blocco di 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

Lead di colonna più selettivi ...

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 banale, (A, B) ha 20 slot ignorabili rispetto ai 18 di (B, A) . Una disparità più ampia genererebbe un ROI maggiore sulla compressione dell'indice o una migliore utilità dalle letture di salto dell'indice.

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

"Penso che se hai un primo indice altamente selettivo, dal punto di vista della performance, farai bene a metterlo al primo posto."

Se abbiamo una colonna altamente selettiva, dovremmo costruirla un proprio indice. È improbabile che i vantaggi aggiuntivi derivanti dall'evitare un'operazione FILTER su una manciata di righe siano controbilanciati dal sovraccarico del mantenimento di un indice composito.

Gli indici a più colonne sono più utili quando abbiamo:

  • due o più colonne di selettività media,
  • che sono usati frequentemente nella stessa query.