Isso importa principalmente quando usado com índices compostos:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
pode ser usado tanto para:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
ou:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, mas não para:
SELECT *
FROM mytable
ORDER BY
col1, col2
Um índice em uma única coluna pode ser usado eficientemente para classificação de ambas as maneiras.
Veja o artigo no meu blog para mais detalhes:
- Índices decrescentes
Atualização:
Na verdade, isso pode importar até mesmo para um índice de coluna única, embora não seja tão óbvio.
Imagine um índice em uma coluna de uma tabela clusterizada:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
O índice em
col1
mantém os valores ordenados de col1
juntamente com as referências às linhas. Como a tabela é agrupada, as referências às linhas são, na verdade, os valores do
pk
. Eles também são ordenados dentro de cada valor de col1
. Isso significa que as folhas do índice são realmente ordenadas em
(col1, pk)
, e esta consulta:SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
não precisa de classificação.
Se criarmos o índice da seguinte forma:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, então os valores de
col1
serão ordenados de forma decrescente, mas os valores de pk
dentro de cada valor de col1
será ordenado em ordem crescente. Isso significa que a seguinte consulta:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
pode ser servido por
ix_mytable_col1_desc
mas não por ix_mytable_col1
. Em outras palavras, as colunas que constituem um
CLUSTERED INDEX
em qualquer tabela são sempre as colunas à direita de qualquer outro índice nessa tabela.