Indexschlüsselspalten sind Teil des B-Baums des Index. Enthaltene Spalten sind nicht.
Nehmen Sie zwei Indizes:
CREATE INDEX index1 ON table1 (col1, col2, col3)
CREATE INDEX index2 ON table1 (col1) INCLUDE (col2, col3)
index1
eignet sich besser für diese Art von Abfrage:
SELECT * FROM table1 WHERE col1 = x AND col2 = y AND col3 = z
Während index2
eignet sich besser für diese Art von Abfrage:
SELECT col2, col3 FROM table1 WHERE col1 = x
In der ersten Abfrage index1
bietet einen Mechanismus zum schnellen Identifizieren der interessierenden Zeilen. Die Abfrage wird (wahrscheinlich) als Indexsuche ausgeführt, gefolgt von einer Lesezeichensuche, um die vollständige(n) Zeile(n) abzurufen.
In der zweiten Abfrage index2
fungiert als abdeckender Index. SQL Server muss überhaupt nicht auf die Basistabelle zugreifen, da der Index alle Daten bereitstellt, die er benötigt, um die Abfrage zu erfüllen. index1
könnte in diesem Fall auch als abdeckender Index fungieren.
Wenn Sie einen abdeckenden Index wollen, aber nicht alle Spalten zum B-Baum hinzufügen wollen, weil Sie nicht nach ihnen suchen, oder nicht können, weil sie kein erlaubter Datentyp sind (zB XML), verwenden Sie den INCLUDE-Klausel.