Pergunta

Quais métodos existem para identificar colunas supérfluas na cobertura dos índices: colunas que nunca são pesquisadas e, portanto, podem ser extraídas para incluir, ou mesmo removidas completamente sem afetar a aplicabilidade do índice?

Foi útil?

Solução

Para esclarecer as coisas
A ideia de um índice de cobertura é que ele também inclui colunas que não podem ser pesquisadas (usadas na cláusula WHERE e outras), mas podem ser selecionadas (parte da lista de colunas selecionadas).

Não parece haver uma maneira fácil de afirmar a existência de colums não utilizados em um índice de cobertura. Só consigo pensar em um processo meticuloso abaixo:

  • Por um período de tempo representativo, registre todas as consultas sendo executadas no servidor (ou na tabela desejada)
  • Filtrar (através de expressão regular) consultas que não envolvem a tabela subjacente
  • Para as consultas restantes, obtenha o plano de consulta; Descarte as perguntas que não estão envolvendo o índice em questão
  • Para as consultas restantes, ou melhor, para cada "modelo" da consulta (muitas consultas são as mesmas, mas para os valores dos critérios de pesquisa), faça a lista das colunas do índice que estão em seleção ou onde a cláusula (ou em junção .. .)
  • As colunas do índice não encontradas nessa lista são positivamente boas para ir.

Agora, pode haver mais algumas [colunas a serem removidas] porque o processo acima não verifica em qual contexto o índice de cobertura é usado (é possível que seja usado para resolver o lugar, mas que a tabela subjacente ainda é acessada também (por exemplo, para chegar às colunas que não estão no índice de cobertura ...)

A abordagem clínica acima não é atraente. Uma abordagem analítica pode ser preferível:

Encontre todas as consultas "modelos" que podem ser usadas em todos os aplicativos usando o servidor. Para cada um desses padrões, encontre os que podem estar usando o índice de cobertura. Estes são (novamente alguns buracos ...) consultas que:

  • Inclua uma referência à tabela subjacente
  • Não cite de forma alguma uma coluna da tabela subjacente que não é uma coluna no índice
  • Não use um critério de pesquisa da tabela subjacente que é mais seletiva do que as colunas do índice (em sua própria ordem ...)

Ou ... sem sequer ir para os aplicativos: Pense em todos os casos de uso, e se as consultas que serviriam a esses casos se beneficiariam de todas as colunas do índice. Fazer isso implicaria que você tem uma idéia relativamente boa da seletividade do índice, em relação às suas primeiras colunas.

Outras dicas

Se você fizer auditorias de seus casos de uso e pontos de dados, obviamente qualquer coisa que não seja usada ou capturada na auditoria seja candidata à exclusão. Se o banco de dados não tiver uma auditoria tão completa, você poderá salvar as perguntas de uma janela de tempo que atingem o banco de dados executando um rastreamento e salvando-o. Você pode analisar o rastreamento e ver que tipo de consultas está chegando ao banco de dados e a partir daí intuit, quais colunas podem ser descartadas.

A análise de rastreamento é normalmente usada para encontrar candidatos para ausência de Índices, mas acho que também pode ser usado para analisar tendências de uso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top