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
oppure:
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:
- Indici decrescenti
Aggiornamento:
In effetti, questo può essere importante anche per un singolo indice di colonna, anche se non è così ovvio.
Immagina un indice su una colonna di una tabella raggruppata:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
L'indice su col1
mantiene i valori ordinati di col1
insieme ai riferimenti alle righe.
Poiché la tabella è raggruppata, i riferimenti alle righe sono in realtà i valori del pk
. Sono anche ordinati all'interno di ogni valore di col1
.
Ciò significa che le foglie dell'indice sono effettivamente ordinate su (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)
, quindi i valori di col1
sarà ordinato decrescente, ma i valori di pk
all'interno di ogni valore di col1
sarà ordinato 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 ci sono sempre le colonne finali di qualsiasi altro indice su quella tabella.