- Falls
a
undb
beide haben 1000 verschiedene Werte und sie werden immer zusammen abgefragt, dann spielt die Reihenfolge der Spalten im Index keine Rolle. Aber wenna
hat nur 10 unterschiedliche Werte oder Sie haben Abfragen, die nur eine der Spalten verwenden, dann spielt es eine Rolle; In diesen Szenarien darf der Index nicht verwendet werden, wenn die Spaltenreihenfolge nicht zur Abfrage passt. - Die Spalte mit den am wenigsten unterschiedlichen Werten sollte an erster Stelle stehen und die Spalte mit den meisten unterschiedlichen Werten an letzter Stelle. Dies maximiert nicht nur den Nutzen des Indexes, sondern erhöht auch die potenziellen Gewinne aus der Indexkomprimierung.
- Der Datentyp und die Länge der Spalte haben einen Einfluss auf die Rendite, die wir aus der Indexkomprimierung erhalten können, aber nicht auf die beste Reihenfolge der Spalten in einem Index.
- Ordnen Sie die Spalten mit der am wenigsten selektiven Spalte zuerst und der selektivsten Spalte zuletzt an. Bei einem Kabelbinder mit der Säule führen, die eher alleine verwendet wird.
Die einzige mögliche Ausnahme zu 2. und 3. sind DATE-Spalten. Da Oracle-DATE-Spalten ein Zeitelement enthalten, können sie pro Tag 86400 unterschiedliche Werte enthalten . Die meisten Abfragen für eine Datenspalte interessieren sich jedoch normalerweise nur für das Tagelement, sodass Sie in Ihren Berechnungen möglicherweise nur die Anzahl der einzelnen Tage berücksichtigen möchten. Obwohl ich vermute, dass dies die relative Selektivität in nur einer Handvoll Fällen nicht beeinflusst.
bearbeiten (als Antwort auf den Kommentar von Nick Pierpoint)
Die zwei Hauptgründe für das Führen mit der am wenigsten selektiven Spalte sind
- Indexkomprimierung
- Index-Lesevorgänge überspringen
Beide entfalten ihre Magie, wenn sie wissen, dass der Wert im aktuellen Slot derselbe ist wie der Wert im vorherigen Slot. Folglich können wir die Rendite dieser Techniken maximieren, indem wir die Anzahl der Wertänderungen minimieren. Im folgenden Beispiel A
hat vier unterschiedliche Werte und B
hat sechs. Die Dittos stellen einen komprimierbaren Wert oder einen überspringbaren Indexblock dar.
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
Selektivste Spaltenführungen ...
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
Auch in diesem einfachen Beispiel (A, B)
hat 20 überspringbare Slots im Vergleich zu den 18 von (B, A)
. Eine größere Diskrepanz würde einen höheren ROI bei der Indexkomprimierung oder einen besseren Nutzen von Index-Skip-Lesevorgängen generieren.
Wie bei den meisten Tuning-Heuristiken müssen wir Benchmarks mit tatsächlichen Werten und realistischen Volumina durchführen. Dies ist definitiv ein Szenario, in dem eine Datenverzerrung dramatische Auswirkungen auf die Effektivität verschiedener Ansätze haben könnte.
"Ich denke, wenn Sie einen sehr selektiven ersten Index haben, dann tun Sie - aus Performance-Perspektive - gut daran, ihn an die erste Stelle zu setzen."
Wenn wir eine hochselektive Spalte haben, sollten wir ihr einen eigenen Index erstellen. Die zusätzlichen Vorteile der Vermeidung eines FILTER-Vorgangs für eine Handvoll Zeilen werden wahrscheinlich nicht durch den Aufwand für die Verwaltung eines zusammengesetzten Index aufgewogen.
Mehrspaltige Indizes sind am nützlichsten, wenn wir Folgendes haben:
- zwei oder mehr Spalten mit mittlerer Selektivität,
- die häufig in derselben Abfrage verwendet werden.