Eliminando índices não utilizados - Avaliando os perigos inesperados

16

Temos um banco de dados muito grande, com centenas de índices não utilizados, de acordo com as estatísticas da DMV, que se acumulam desde a última reinicialização do servidor, em julho. Um de nossos DBAs fez as seguintes declarações de advertência, que não fazem sentido para mim:

  1. Antes de soltar um índice, precisamos garantir que ele não imponha uma restrição de exclusividade, pois o otimizador de consulta pode precisar que esse índice exista.
  2. Sempre que um índice é criado, as estatísticas relacionadas a esse índice também são criadas no SQL Server. Uma consulta pode não estar usando o índice, mas pode estar usando suas estatísticas. Portanto, podemos ter uma situação, depois de soltar um índice, um determinado desempenho de consulta fica muito ruim. O SQL Server não mantém as estatísticas de uso das estatísticas. Embora tenhamos o recurso "Criar estatísticas automaticamente" ativado em nosso banco de dados, não sei quais todos os parâmetros devem ser atendidos internamente antes que o otimizador de consultas crie as estatísticas ausentes.

Em relação ao item 1, parece-me que o SQL Server realmente procuraria o índice para determinar a exclusividade antes que uma inserção / atualização fosse feita e, portanto, o índice não seria exibido como não sendo usado.

Em relação ao item 2, isso é realmente possível?

A propósito, quando digo que um índice não é usado, quero dizer que não há buscas nem verificações.

Randy Minder
fonte
3
Sugiro que você desative o índice quando tiver certeza absoluta de que esse índice não será usado nem mesmo na execução de relatórios de final de ano.
Kin Shah

Respostas:

17

As preocupações do seu DBA são válidas.

Em relação ao item 1, parece-me que o SQL Server realmente procuraria o índice para determinar a exclusividade antes que uma inserção / atualização fosse feita e, portanto, o índice não seria exibido como não sendo usado.

A garantia de exclusividade pode ser usada pelo otimizador para decidir quais transformações lógicas ou operações físicas podem ser usadas para obter resultados corretos. O fato de o otimizador contar com uma garantia de exclusividade para, por exemplo, transformar uma agregação ou escolher uma junção de mesclagem um para muitos, não será refletido nas estatísticas de uso do índice, a menos que o índice também seja acessado fisicamente no plano de execução final . Portanto, deve-se ter muito cuidado ao remover (ou desabilitar) qualquer índice ou restrição exclusiva.

Em relação ao item 2, isso é realmente possível?

Sim, é possível que o otimizador use estatísticas associadas a um índice sem o plano de execução final apresentando qualquer acesso usando esse índice. Os processos de carregamento de estatísticas 'interessantes', cálculo de estimativas de cardinalidade e produção de um plano de execução concluído são atividades bastante independentes.

A eliminação do índice também removeria as estatísticas do índice associadas, o que pode afetar a qualidade do plano na próxima vez que a instrução for recompilada. As estatísticas do índice podem ser usadas em um cálculo de estimativa de cardinalidade em que o plano final se baseia, mesmo quando o índice não está fisicamente presente no plano final.

Seu DBA conhece as coisas dele / dela.

Nada disso deve significar que índices aparentemente não utilizados nunca devem ser removidos. Estou simplesmente dizendo que as preocupações do seu DBA são válidas e você deve planejar a alteração com elas de acordo, com testes apropriados e um plano de recuperação. Na minha experiência, é mais provável que o ponto 1 seja problemático que o número 2, mas não tenho como saber se isso se aplica à sua situação.

Paul White restabelece Monica
fonte