Costumo usar o SSMS para testar meus procedimentos armazenados lentos quanto a índices ausentes. Sempre que vejo um "Índice ausente (Impacto xxx)", minha reação instintiva é apenas criar o novo índice. Isso resulta em uma consulta mais rápida todas as vezes, até onde eu sei.
Alguma razão para eu não continuar fazendo isso?
Respostas:
Muitas razões.
Uma das maiores em que consigo pensar é que os DMVs de índice ausentes não levam em consideração os índices existentes.
Exemplo:
Você tem uma mesa com
ColA, ColB, ColC
.Atualmente você tem um índice em
ColA
. O DMV de índice ausente sugere que você adicione um índice(ColA, ColB)
. Isso pode estar correto, mas a coisa mais inteligente a fazer é adicionarColB
como uma segunda chave no índice existente. Caso contrário, você terá cobertura duplicada, espaço desperdiçado e sobrecarga.Da mesma forma, se você tiver um índice
ColB INCLUDE (ColA)
, pode sugerir um índiceColB INCLUDE (ColC)
. Novamente, a coisa mais inteligente a fazer é adicionarColC
à lista de inclusão no índice existente.Os índices sugeridos têm uma visão extremamente restrita - eles olham apenas para uma única consulta ou para uma única operação em uma única consulta. Eles não levam em conta o que já existe ou seus outros padrões de consulta.
Você ainda precisa de um ser humano pensante para analisar a estratégia geral de indexação e garantir que a estrutura do índice seja eficiente e coesa.
Se não houvesse problemas em adicionar todos os índices sugeridos, não haveria necessidade de sugeri-los - eles seriam implementados automaticamente.
fonte
duplicate index scripts
ou algo semelhante, existem muitos recursos para rastrear essas coisas. Eu gerencio a maioria dos meus próprios índices e sei um pouco sobre isso, mas ainda encontro enganos de tempos em tempos.Eu recomendo o uso cauteloso dessa técnica de ajuste, pois acho que as sugestões de índice ausentes exibidas pelos planos de consulta são consistentemente menos confiáveis, pois as consultas e os esquemas de banco de dados se tornam progressivamente mais complexos. Isso ocorreu devido a uma variedade de razões em minha experiência:
1) A "porcentagem de melhoria" pode ser muito difícil para todas as consultas, exceto as mais simples / os índices mais óbvios, afinal é apenas uma estimativa e não deriva dos custos reais incorridos ou das contas reais quando a consulta é executada. Vi custos de consulta subirem após a implementação de um índice sugerido, ou ele nem se acostuma e o plano permanece o mesmo.
2) O plano de consulta em si não é ideal, devido à construção da consulta (junções e cláusula where não otimizada, etc), ou as estimativas de contagem de linhas estão desativadas devido a estatísticas ausentes / desatualizadas. A indexação para um plano de consulta brutalmente ruim geralmente é, na melhor das hipóteses, uma solução de band-aid com apenas uma melhoria incremental no desempenho.
3) Você pode não estar vendo a imagem inteira. Isso é especialmente verdadeiro ao usar apenas o plano gráfico e não exibir o XML para ver se mais de um índice ausente foi sugerido. O primeiro mostrado no plano gráfico não é necessariamente aquele com maior impacto na consulta.
4) Também encontrei muitos exemplos de novos índices sugeridos ao modificar o índice existente. Veja as outras respostas aqui sobre esse ponto, elas estão no local, não há necessidade de eu aprofundar.
Eu só uso as sugestões de índice ausentes como ponto de partida ao trabalhar com uma consulta / ambiente desconhecido para ver onde procurar mais. Eu obtive melhores resultados observando os operadores no plano (principalmente as buscas / verificações / junções) e verificando a dica de ferramenta ou a janela de propriedades para ver quais colunas estão envolvidas e usando isso para determinar os candidatos a índices para testar a melhoria.
fonte
Há várias razões, principalmente - sabendo como os índices funcionam e armazenados - você sempre criará um índice melhor, ou pelo menos - não pior, que as sugestões do SSMS
fonte