Reihenfolge der nicht gruppierten Indexspalten


7

Ich habe einen nicht gruppierten Index (aufgerufen NCIDX1) col1, col2für eine Tabelle. Ich habe col3, col4, col5, col6als eingeschlossene Spalten in diese Reihenfolge aufgenommen.

Wenn ich die folgende Abfrage ausführe:

select 
     col1,col2 
from 
     tbl1
where 
     col3 = something
and
     col4 = something
and
     col5 = something

Ist es anders als Laufen:

select 
     col3,col2 ,col4
from 
     tbl1
where 
     col1 = something
and
     col5 = something

?

Ich versuche zu sagen: Wenn wir einen Deckungsindex wie den oben genannten erstellen und die Reihenfolge ändern, in der wir auf Daten zugreifen, wird dieser Deckungsindex trotzdem genutzt?

Auch die Reihenfolge der Gleichheitsspalten (untereinander) und der Nichtgleichheitsspalten (untereinander) ... spielt es eine Rolle? Wie where equalitycol2='' and equalitycol1=''.

Antworten:


8

Im Allgemeinen sollte ein Index aktiviert sein

(equalitycol1, equalitycol2, ..., nonequalitycol1, , nonequalitycol2, ...)
INCLUDE
(outputonlycol1, outputonlycol2, ...)

Einfach (Bereiche ignorieren) zerfällt dies in

  • Gleichheit : WHERE equalitycol = something. Am selektivsten zuerst. SARGable. Sucht.
  • nonequalitycol : WHERE nonequalitycol <> something. Restfilter
  • Ausgabe nur : SELECT outputonlycol. Keine Filterung oder Bestellung

ORDER BYund GROUP BYSpalten sind Gleichheits- oder Nichtgleichheitsspalten.

In diesem Fall...

Abfrage 1 stimmt überhaupt nicht mit dem Index überein, daher wird der Index höchstwahrscheinlich nicht verwendet. Der Optimierer kann jedoch entscheiden, dass die Verwendung des Index billiger ist als die Verwendung eines anderen Tabellenzugriffs, z. B. eines Tabellenscans oder einer RID- / Lesezeichen-Suche.

Für Abfrage 2 kann der Optimierer entscheiden, den Index zu verwenden, da col1dies eine Gleichheitsübereinstimmung wäre. Und dann benutze das unsortierte col5aus dem INCLUDE. YMMV, aber es gibt eine höhere Chance.

Für die WHEREKlauselreihenfolge nein: Der Optimierer arbeitet es aus. Zwei Indizes (col1, col2)und (col2, col1)sind jedoch unterschiedlich. Hinweis (col1, col2)wird von enthalten sein, (col1, col2, col3, col4)so dass der erste nicht benötigt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.