Esto importa principalmente 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 en ambos sentidos.
Vea el artículo en mi blog para más detalles:
- Índices descendentes
Actualización:
De hecho, esto puede ser importante 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 los valores ordenados de col1
junto con las referencias a las filas.
Dado que la tabla está agrupada, las referencias a las filas son en realidad los valores del pk
. También se ordenan dentro de cada valor de col1
.
Esto significa que las hojas del índice en realidad están ordenadas en (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)
, luego los valores de col1
se ordenarán de forma descendente, pero los valores de pk
dentro de cada valor de col1
se ordenará 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 siempre están las columnas finales de cualquier otro índice en esa tabla.