Indexnyckelkolumner är en del av indexets b-träd. Inkluderade kolumner är inte.
Ta två index:
CREATE INDEX index1 ON table1 (col1, col2, col3)
CREATE INDEX index2 ON table1 (col1) INCLUDE (col2, col3)
index1
är bättre lämpad för denna typ av fråga:
SELECT * FROM table1 WHERE col1 = x AND col2 = y AND col3 = z
Medan index2
är bättre lämpad för denna typ av fråga:
SELECT col2, col3 FROM table1 WHERE col1 = x
I den första frågan, index1
tillhandahåller en mekanism för att snabbt identifiera raderna av intresse. Frågan kommer (förmodligen) att köras som en indexsökning, följt av en bokmärkessökning för att hämta hela raden/raderna.
I den andra frågan, index2
fungerar som ett täckande index. SQL Server behöver inte träffa bastabellen alls, eftersom indexet tillhandahåller all data den behöver för att tillfredsställa frågan. index1
skulle också kunna fungera som ett täckande index i detta fall.
Om du vill ha ett täckande index, men inte vill lägga till alla kolumner i b-trädet eftersom du inte söker på dem, eller inte kan eftersom de inte är en tillåten datatyp (t.ex. XML), använd INKLUDERA klausul.