Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Indexschlüsselspalte VS Index enthaltene Spalte

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.