Ciò è importante soprattutto se utilizzato con indici compositi:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
può essere utilizzato per:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
o:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, ma non per:
SELECT *
FROM mytable
ORDER BY
col1, col2
Un indice su una singola colonna può essere utilizzato in modo efficiente per l'ordinamento in entrambi i modi.
Vedi l'articolo nel mio blog per i dettagli:
Aggiornare:
In effetti, questo può importare anche per un indice a colonna singola, sebbene non sia così ovvio.
Immagina un indice su una colonna di una tabella cluster:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
L'indice col1
attivo mantiene i valori ordinati col1
insieme ai riferimenti alle righe.
Poiché la tabella è raggruppata, i riferimenti alle righe sono in realtà i valori di pk
. Sono inoltre ordinati entro ciascun valore di col1
.
Ciò significa che le foglie dell'indice sono effettivamente ordinate (col1, pk)
e questa query:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
non ha bisogno di smistamento.
Se creiamo l'indice come segue:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, i valori di col1
verranno ordinati in ordine decrescente, ma i valori di pk
all'interno di ciascun valore di col1
verranno ordinati in ordine crescente.
Ciò significa che la seguente query:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
può essere servito da ix_mytable_col1_desc
ma non da ix_mytable_col1
.
In altre parole, le colonne che costituiscono un CLUSTERED INDEX
su qualsiasi tabella sono sempre le colonne finali di qualsiasi altro indice su quella tabella.