Ouvi dizer que você deve colocar colunas que serão as mais seletivas no início da declaração do índice. Exemplo:
CREATE NONCLUSTERED INDEX MyINDX on Table1
(
MostSelective,
SecondMost,
Least
)
Primeiro, é o que estou dizendo correto? Nesse caso, é provável que eu observe grandes diferenças no desempenho reorganizando a ordem das colunas no meu índice ou é mais uma prática "agradável de fazer"?
A razão pela qual estou perguntando é porque, depois de fazer uma consulta no DTA, é recomendável criar um índice que contenha quase todas as mesmas colunas que um índice existente, apenas em uma ordem diferente. Eu estava pensando em adicionar as colunas ausentes ao índice existente e chamá-lo de bom. Pensamentos?
fonte
A ordem das colunas é crítica. Agora, qual ordem está correta, depende de como você a consultará. Um índice pode ser usado para fazer uma busca exata ou uma varredura de intervalo. Uma busca exata é quando valores para todas as colunas no índice são especificados e a consulta fica exatamente na linha em que está interessado. Para pesquisas, a ordem das colunas é irrelevante. Uma varredura de intervalo é quando apenas algumas colunas são especificadas e, nesse caso, quando o pedido se torna importante. O SQL Server pode usar um índice para uma verificação de intervalo somente se a coluna mais à esquerda estiver especificada e, somente, se a próxima coluna à esquerda estiver especificada, e assim por diante. Se você tiver um índice em (A, B, C), ele poderá ser usado para varrer a varredura para
A=@a
, para,A=@a AND B=@b
mas não paraB=@b
, paraC=@c
nemB=@b AND C=@c
. O casoA=@a AND C=@c
é misto, como noA=@a
parte usará o índice, mas oC=@c
não (a consulta varrerá todos os valores BA=@a
, não 'pulará' paraC=@c
). Outros sistemas de banco de dados têm o operador 'skip scan', que pode tirar vantagem de colunas internas de um índice quando as colunas externas não são especificadas.Com esse conhecimento em mãos, você pode examinar as definições de índice novamente. Um índice ativado
(MostSelective, SecondMost, Least)
será efetivo somente quando aMostSelective
coluna for especificada. Mas, sendo a mais seletiva, a relevância das colunas internas se degradará rapidamente. Muitas vezes, você descobrirá que um índice melhor está ativado(MostSelective) include (SecondMost, Least)
ou desativado(MostSelective, SecondMost) include (Least)
. Como as colunas internas são menos relevantes, a colocação de colunas de baixa seletividade nessas posições corretas no índice não faz nada além de ruído para uma busca; portanto, faz sentido movê-las para fora das páginas intermediárias e mantê-las apenas nas páginas de folha, por fins de cobertura de consultas. Em outras palavras, mova-os para INCLUIR. Isso se torna mais importante à medida que o tamanho daLeast
coluna aumenta. A ideia é que esse índice possa beneficiar apenas consultas que especificamMostSelective
como um valor exato ou um intervalo, e essa coluna, sendo a mais seletiva, já restringe as linhas candidatas em grande medida.Por outro lado, um índice
(Least, SecondMost, MostSelective)
pode parecer um erro, mas na verdade é um índice bastante poderoso. Por ter aLeast
coluna como sua consulta mais externa, ela pode ser usada para consultas que precisam agregar resultados em colunas de baixa seletividade. Essas consultas são predominantes nos armazéns de dados OLAP e de análise, e é exatamente nesse ponto que esses índices têm um bom argumento. Na verdade, esses índices são excelentes índices agrupados , exatamente porque organizam o layout físico em grandes blocos de linhas relacionadas (mesmoLeast
valor, que geralmente indicam algum tipo de categoria ou tipo) e facilitam as consultas de análise.Infelizmente, não há uma ordem 'correta'. Você não deve seguir nenhuma receita do cortador de biscoitos, mas sim analisar o padrão de consulta que você usará nessas tabelas e decidir qual ordem da coluna de índice está correta.
fonte
Como Remus diz, depende da sua carga de trabalho.
Quero abordar um aspecto enganador da resposta aceita.
Para consultas que estão executando uma pesquisa de igualdade em todas as colunas no índice, não há diferença significativa.
O abaixo cria duas tabelas e as preenche com dados idênticos. A única diferença é que um tem as chaves ordenadas do mais para o menos seletivo e o outro, o inverso.
Agora, fazendo uma consulta nas duas tabelas ...
... Ambos usam uma multa de índice e recebem exatamente o mesmo custo.
A arte ASCII na resposta aceita não é de fato como os índices são estruturados. As páginas de índice da Tabela1 estão representadas abaixo (clique na imagem para abrir em tamanho real).
As páginas de índice contêm linhas que contêm a chave inteira (nesse caso, na verdade, há uma coluna de chave adicional anexada ao identificador de linha, pois o índice não foi declarado como único, mas que pode ser desconsiderado, informações adicionais sobre isso podem ser encontradas aqui ).
Para a consulta acima, o SQL Server não se importa com a seletividade das colunas. Ele faz uma pesquisa binária da página raiz e descobre que a chave
(PPP...,3,~ )
é>=(JJJ...,1,~ )
e< (SSS...,3,~ )
deve ler a página1:118
. Em seguida, ele faz uma pesquisa binária das entradas principais nessa página e localiza a página da folha para a qual viajar.Alterar o índice em ordem de seletividade não afeta o número esperado de comparações de chaves da pesquisa binária ou o número de páginas que precisam ser navegadas para fazer uma pesquisa no índice. Na melhor das hipóteses, pode acelerar marginalmente a própria comparação de chaves.
Às vezes, solicitar o índice mais seletivo primeiro fará sentido para outras consultas em sua carga de trabalho.
Por exemplo, se a carga de trabalho contiver consultas dos dois formulários a seguir.
Os índices acima não estão cobrindo para nenhum deles.
MostSelective
é seletivo o suficiente para fazer um plano com uma busca e pesquisas que valham a pena, mas a consulta contraLeast
não é.No entanto, esse cenário (busca de índice não abrangente no subconjunto de colunas principais de um índice composto) é apenas uma classe de consulta possível que pode ser ajudada por um índice. Se você nunca pesquisar
MostSelective
sozinho ou uma combinação deMostSelective, SecondMost
e sempre procurar por uma combinação das três colunas, essa vantagem teórica será inútil para você.Por outro lado, consultas como
Seria ajudado por ter a ordem inversa da normalmente prescrita - já que abrange a consulta, pode suportar uma busca e retorna linhas na ordem desejada para inicializar.
Portanto, este é um conselho frequentemente repetido, mas, no máximo, é uma heurística sobre o benefício potencial para outras consultas - e não é um substituto para realmente analisar sua carga de trabalho.
fonte
Corrigir. Os índices podem ser compostos - compostos por várias colunas - e a ordem é importante por causa do princípio mais à esquerda. O motivo é que o banco de dados verifica a lista da esquerda para a direita e precisa encontrar uma referência de coluna correspondente que corresponda à ordem definida. Por exemplo, ter um índice em uma tabela de endereços com colunas:
Qualquer consulta usando a
address
coluna pode utilizar o índice, mas se a consulta tiver apenas referênciascity
e / oustate
- o índice não poderá ser usado. Isso ocorre porque a coluna mais à esquerda não é referenciada. O desempenho da consulta deve informar qual é o ideal - índices individuais ou vários compostos com ordens diferentes. Boa leitura: The Tipping Point , de Kimberley Trippfonte
Todas as outras respostas estão erradas.
A seletividade das colunas individuais em um índice composto não importa ao escolher o pedido.
Aqui está o processo simples de pensamento: efetivamente, um índice é a concatenação das colunas envolvidas.
Dando essa justificativa, a única diferença é comparar duas 'strings' que diferem mais cedo ou mais tarde na string. Esta é uma pequena parte do custo total. Não há "primeira passagem / segunda passagem", como mencionado em uma resposta.
Então, qual ordem deve ser usada?
=
, em qualquer ordem.Por exemplo, a coluna de seletividade muito baixa deve vir em primeiro lugar:
Trocar a ordem no índice faria com que ela fosse totalmente ignorada
deleted
.(Existem muito mais regras para ordenar as colunas.)
fonte
deleted
não ajuda muito na filtragem de linhas indesejadas. Você tem um exemplo melhor? (Isso é o que me veio à mente quando eu escrevi a resposta.)