Eu já sei a resposta para essa pergunta, mas sempre sinto que preciso entender mais sobre o assunto.
Meu entendimento básico é que, de um modo geral, um único índice que inclui apenas todos os campos nos quais você pode estar consultando / classificando a qualquer momento não é útil, mas já vi esse tipo de coisa. Alguém pensou: "Bem, se colocarmos tudo isso em um índice, o banco de dados pode usá-lo para encontrar o que precisa", sem nunca ter visto um plano de execução para algumas das consultas reais sendo executadas.
Imagine uma tabela como esta:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
Talvez eu veja um único índice, incluindo os campos name
, customerId
e dateCreated
.
Mas meu entendimento é que esse índice não seria usado em uma consulta como, por exemplo:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
Para essa consulta, parece-me que uma idéia melhor seria um índice incluindo os campos customerId
e dateCreated
, com o customerId
campo sendo o 'primeiro'. Isso criaria um índice que teria os dados organizados de forma que essa consulta pudesse encontrar rapidamente o que precisa - na ordem em que ela precisa.
Outra coisa que vejo, talvez tão freqüentemente quanto a primeira, são índices individuais em cada campo; por isso, cada um sobre name
, customerId
e dateCreated
campos.
Diferentemente do primeiro exemplo, esse tipo de arranjo me parece às vezes pelo menos parcialmente útil; o plano de execução da consulta pode mostrar que pelo menos está usando o índice no customerId
para selecionar os registros, mas não está usando o índice com o dateCreated
campo para classificá-los.
Sei que essa é uma pergunta ampla, porque a resposta específica a qualquer consulta em particular em um determinado conjunto de tabelas é geralmente ver o que o plano de execução diz que vai fazer e, de outra forma, levar as especificidades da (s) tabela (s) e consultas para conta. Além disso, sei que depende da frequência com que uma consulta pode ser executada, em oposição à sobrecarga de manter um índice específico para ela.
Mas suponho que o que estou perguntando é como um "ponto de partida" geral para índices, a idéia de ter índices específicos para consultas específicas e freqüentemente puxadas e os campos nas cláusulas WHERE ou ORDER BY fazem sentido?