Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Índices do SQL Server - ascendente ou descendente, que diferença faz?


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.