Ao criar um índice em uma coluna ou número de colunas no MS SQL Server (estou usando a versão 2005), você pode especificar que o índice em cada coluna seja crescente ou decrescente. Estou tendo dificuldade para entender por que essa escolha está aqui. Usando técnicas de classificação binária, uma pesquisa não seria tão rápida de qualquer maneira? Que diferença faz qual ordem eu escolho?
sql
sql-server
optimization
indexing
Joshua Carmody
fonte
fonte
Respostas:
Isso é importante principalmente quando usado com índices compostos:
pode ser usado para:
ou:
, mas não para:
Um índice em uma única coluna pode ser usado com eficiência na classificação dos dois modos.
Veja o artigo no meu blog para obter detalhes:
Atualizar:
De fato, isso pode importar mesmo para um índice de coluna única, embora não seja tão óbvio.
Imagine um índice em uma coluna de uma tabela em cluster:
O índice on
col1
mantém os valores ordenadoscol1
junto com as referências às linhas.Como a tabela está agrupada, as referências às linhas são, na verdade, os valores de
pk
. Eles também são ordenados dentro de cada valor decol1
.Isso significa que as folhas do índice são realmente ordenadas
(col1, pk)
e esta consulta:não precisa de classificação.
Se criarmos o índice da seguinte maneira:
, os valores de
col1
serão classificados em ordem decrescente, mas os valorespk
em cada valor decol1
serão classificados em ordem crescente.Isso significa que a seguinte consulta:
pode ser servido por,
ix_mytable_col1_desc
mas não porix_mytable_col1
.Em outras palavras, as colunas que constituem um
CLUSTERED INDEX
em qualquer tabela são sempre as colunas finais de qualquer outro índice nessa tabela.fonte
Para um verdadeiro índice de coluna única, faz pouca diferença do ponto de vista do Query Optimizer.
Para a definição da tabela
A pergunta
Usa uma varredura ordenada com a direção da varredura,
BACKWARD
como pode ser visto no Plano de Execução. No entanto, há uma pequena diferença, pois atualmente apenas asFORWARD
verificações podem ser paralelizadas.No entanto , pode fazer uma grande diferença em termos de fragmentação lógica . Se o índice for criado com chaves descendentes, mas novas linhas forem anexadas com valores de chave ascendentes, você poderá terminar todas as páginas fora de ordem lógica. Isso pode afetar gravemente o tamanho das leituras de E / S ao verificar a tabela e ela não está no cache.
Veja os resultados da fragmentação
para o script abaixo
É possível usar a guia de resultados espaciais para verificar a suposição de que isso ocorre porque as páginas posteriores têm valores-chave crescentes nos dois casos.
fonte
A ordem de classificação é importante quando você deseja recuperar muitos dados classificados, não registros individuais.
Observe que (como você sugere na sua pergunta) a ordem de classificação é tipicamente muito menos significativa do que as colunas que você está indexando (o sistema pode ler o índice ao contrário, se a ordem for oposta ao que deseja). Raramente penso na ordem de classificação do índice, enquanto sofro com as colunas cobertas pelo índice.
@Quassnoi fornece um grande exemplo de quando isso não importa.
fonte