Dies ist vor allem bei der Verwendung mit zusammengesetzten Indizes von Bedeutung:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
kann verwendet werden für:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
oder:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, aber nicht für:
SELECT *
FROM mytable
ORDER BY
col1, col2
Ein Index für eine einzelne Spalte kann auf beide Arten effizient zum Sortieren verwendet werden.
Weitere Informationen finden Sie im Artikel in meinem Blog:
Aktualisieren:
Tatsächlich kann dies sogar für einen einzelnen Spaltenindex von Bedeutung sein, obwohl dies nicht so offensichtlich ist.
Stellen Sie sich einen Index für eine Spalte einer gruppierten Tabelle vor:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Der Index für enthält col1
geordnete Werte von col1
zusammen mit den Verweisen auf Zeilen.
Da die Tabelle geclustert ist, sind die Verweise auf Zeilen tatsächlich die Werte von pk
. Sie sind auch innerhalb jedes Wertes von bestellt col1
.
Dies bedeutet, dass die Blätter des Index tatsächlich sortiert sind (col1, pk)
, und diese Abfrage:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
braucht keine Sortierung.
Wenn wir den Index wie folgt erstellen:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
Dann werden die Werte von col1
absteigend sortiert, aber die Werte pk
innerhalb jedes Werts von col1
werden aufsteigend sortiert.
Dies bedeutet, dass die folgende Abfrage:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
kann von serviert werden, ix_mytable_col1_desc
aber nicht von ix_mytable_col1
.
Mit anderen Worten, die Spalten, die eine CLUSTERED INDEX
in einer Tabelle bilden, sind immer die nachfolgenden Spalten eines anderen Index in dieser Tabelle.