Índices múltiplos versus índices de várias colunas

646

Acabei de adicionar um índice a uma tabela no SQL Server 2005 e isso me fez pensar. Qual é a diferença entre criar 1 índice e definir várias colunas sobre ter 1 índice por coluna que você deseja indexar.

Existem certas razões pelas quais uma deve ser usada sobre a outra?

Por exemplo

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Versus

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)
GateKiller
fonte

Respostas:

319

Eu concordo com o Cade Roux .

Este artigo deve colocá-lo no caminho certo:

Uma coisa a observar, os índices clusterizados devem ter uma chave exclusiva (uma coluna de identidade que eu recomendaria) como a primeira coluna. Basicamente, ajuda seus dados a serem inseridos no final do índice e não causa muitas E / S de disco e divisões de página.

Em segundo lugar, se você estiver criando outros índices nos seus dados e eles forem construídos de maneira inteligente, eles serão reutilizados.

Por exemplo, imagine que você pesquise uma tabela em três colunas

estado, município, zip.

  • você às vezes pesquisa apenas por estado.
  • você às vezes pesquisa por estado e município.
  • você pesquisa frequentemente por estado, município, CEP.

Em seguida, um índice com estado, município, zip. será usado nas três pesquisas.

Se você pesquisar sozinho apenas por zip, o índice acima não será usado (pelo SQL Server de qualquer maneira), pois zip é a terceira parte desse índice e o otimizador de consultas não considerará esse índice útil.

Você poderia criar um índice apenas no Zip que seria usado nesta instância.

A propósito: Podemos tirar vantagem do fato de que, com a indexação de várias colunas, a primeira coluna de índice é sempre utilizável para pesquisa e, quando você pesquisa apenas por 'estado', é eficiente, mas ainda não tão eficiente quanto o índice de coluna única no estado ' "

Eu acho que a resposta que você está procurando é que depende das cláusulas where das suas consultas usadas com freqüência e também do seu grupo por.

O artigo vai ajudar muito. :-)

evilhomer
fonte
2
Então, a melhor coisa a fazer é definir um índice para estado, município e CEP, além de um índice individual para cada coluna?
Maxim Zaslavsky
12
@jball Estou faltando alguma coisa aqui? Parece que o artigo trata principalmente das diferenças entre as limitações de versão do SQL Server. O artigo poderia ter sido movido?
Ian R. O'Brien
@Ian, parece que algo se perdeu nos próximos três anos desde que resolvi o link original a partir de agora, há mais de 4 anos. Posso dizer que a postagem do blog tem o título correto, como foi vinculado pelo evilhomer, mas parece que os blogs de acompanhamento da série não são mais facilmente encontrados a partir dessa primeira postagem. Você terá que procurar no arquivo do blog de Kimberly para ver se consegue encontrar os outros da série.
jball
1
1) "Basicamente [Índice agrupado com coluna IDENTITY como primeiro] ajuda a inserção de dados no final do índice" está correto. "e não causar muitas E / S de disco e divisões de página" é totalmente falso em um sistema multiusuário. A verdade é que garante alta contenção (baixa concorrência) em um sistema multiusuário. 2) O índice clusterizado deve ser uma Chave Relacional, ou seja. não é IDENTITY, GUID, etc. 3) "Em seguida, um índice com estado, município e CEP será usado nas três pesquisas." é falso e contradiz "a primeira coluna é utilizável". As segundas e secundárias colunas do índice não são utilizáveis ​​para pesquisa.
PerformanceDBA
81

Sim. Eu recomendo que você verifique os artigos de Kimberly Tripp sobre indexação .

Se um índice estiver "cobrindo", não será necessário usar nada além do índice. No SQL Server 2005, você também pode adicionar colunas adicionais ao índice que não fazem parte da chave, o que pode eliminar as viagens para o restante da linha.

Tendo vários índices, cada um em uma única coluna pode significar que apenas um índice é usado - você precisará consultar o plano de execução para ver quais efeitos os diferentes esquemas de indexação oferecem.

Você também pode usar o assistente de ajuste para ajudar a determinar quais índices farão com que uma determinada consulta ou carga de trabalho tenha o melhor desempenho.

Cade Roux
fonte
7
Kimberly Tripp sabe do que está falando. Eu estava conversando com ela e ela sabe disso de dentro para fora. Ótimo conselho.
evilhomer 7/10/08
@CadeRoux Se na maioria das vezes minha cláusula where possui 2 colunas no relacionamento '&', será melhor ter um índice de várias colunas nelas ou um índice de coluna única em ambas
É uma armadilha em
2
Um índice @RachitGupta com ambas as colunas
Cade Roux
40

O índice de várias colunas pode ser usado para consultas referentes a todas as colunas:

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

Isso pode ser consultado diretamente usando o índice de várias colunas. Por outro lado, no máximo um índice de coluna única pode ser usado (ele teria que procurar todos os registros com Coluna1 = 1 e, em seguida, marcar Coluna2 e Coluna3 em cada um deles).

MobyDX
fonte
24
Isto está correto. No entanto, ter essas colunas como um único índice cada uma ainda aceleraria as coisas drasticamente. Geralmente, um dos valores nas colunas reduz tanto o conjunto resultante que não importa procurar o restante sem um índice, e o otimizador é bom em escolher esse valor.
TToni 07/10/08
16

Um item que parece ter sido esquecido são as transformações em estrelas. Os operadores de interseção de índice resolvem o predicado calculando o conjunto de linhas atingidas por cada um dos predicados antes que qualquer E / S seja feita na tabela de fatos. Em um esquema em estrela, você indexaria cada chave de dimensão individual e o otimizador de consulta pode resolver quais linhas selecionar pelo cálculo da interseção do índice. Os índices em colunas individuais oferecem a melhor flexibilidade para isso.

ConcernedOfTunbridgeWells
fonte
+1 para uma boa explicação vinculada de como os índices (comuns) são usados, relevantes para a pergunta.
RobM 12/08/11
7

Se você tiver consultas que freqüentemente usarão um conjunto de colunas relativamente estático, a criação de um único índice de cobertura que inclua todas elas melhorará drasticamente o desempenho.

Ao colocar várias colunas no seu índice, o otimizador só precisará acessar a tabela diretamente se uma coluna não estiver no índice. Eu uso muito isso no data warehousing. A desvantagem é que isso pode custar muito mais, especialmente se os dados forem muito voláteis.

Criar índices em colunas únicas é útil para operações de pesquisa frequentemente encontradas em sistemas OLTP.

Você deve se perguntar por que está indexando as colunas e como elas serão usadas. Execute alguns planos de consulta e veja quando eles estão sendo acessados. O ajuste do índice é tanto instinto quanto a ciência.

Bob Probst
fonte