Esto es principalmente importante cuando se usa con índices compuestos:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
se puede usar para:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
o:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, pero no para:
SELECT *
FROM mytable
ORDER BY
col1, col2
Un índice en una sola columna se puede usar de manera eficiente para ordenar de ambas maneras.
Vea el artículo en mi blog para más detalles:
Actualizar:
De hecho, esto puede importar incluso para un índice de una sola columna, aunque no es tan obvio.
Imagine un índice en una columna de una tabla agrupada:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
El índice en col1
mantiene valores ordenados col1
junto con las referencias a filas.
Como la tabla está agrupada, las referencias a las filas son en realidad los valores de pk
. También se ordenan dentro de cada valor de col1
.
Esto significa que las hojas del índice están realmente ordenadas (col1, pk)
y esta consulta:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
No necesita clasificación.
Si creamos el índice de la siguiente manera:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, los valores de col1
se ordenarán de forma descendente, pero los valores de pk
dentro de cada valor de col1
se ordenarán de forma ascendente.
Esto significa que la siguiente consulta:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
puede ser servido por ix_mytable_col1_desc
pero no por ix_mytable_col1
.
En otras palabras, las columnas que constituyen un CLUSTERED INDEX
en cualquier tabla son siempre las columnas finales de cualquier otro índice en esa tabla.