tl; dr - Como afirma o título - Se eu desabilitar um índice não clusterizado em uma tabela, as estatísticas vinculadas para esse índice ainda serão usadas?
Estou ciente de que há muitas perguntas sobre "eliminar ou desabilitar índices" ... mas nenhuma que eu possa encontrar que abranja especificamente as estatísticas.
Eu sei que as estatísticas não são alteradas ou alteradas (pelo menos é o que reuni na documentação do MS). Mas minha pergunta é se as estatísticas ainda são usadas .
Como pano de fundo, estou trabalhando em um grande projeto de ajuste de índice. Envolve adicionar/remover índices em centenas de bancos de dados idênticos, mas com padrões de carga de trabalho variados. Coletivamente, há mais de 2 milhões de índices.
Meu primeiro passo é descartar quaisquer índices "não utilizados". No entanto, em vez de descartá-los, estou pensando em apenas desativá-los para que a definição seja mantida. Isso me permitiria registrar em uma tabela a instância, banco de dados, id do objeto e nome/id do índice de qualquer índice desabilitado. Se o desempenho começar a diminuir depois, o índice poderá ser reativado (recriado).
No entanto, se as estatísticas para o índice desabilitado ainda forem usadas para gerar planos... desativá-las não terá o mesmo impacto no desempenho que eliminá-las. Se for esse o caso, desabilitar o índice não é um teste de impacto de desempenho "verdadeiro" e corro o risco de apresentar problemas de desempenho se os índices desabilitados forem eventualmente descartados.
Sim, o otimizador ainda usa as estatísticas mesmo quando o índice está desabilitado.
Para a demonstração, estou usando o AdventureWorks2019 OLTP e um exemplo de consulta da documentação
Vou executar esta consulta com plano de execução real
Se eu abrir o XML do plano de execução, posso ver as estatísticas que estão sendo usadas (excluí alguns atributos para brevidade).
Criarei as estatísticas recomendadas de acordo com o exemplo e reexecutarei a consulta
No topo, podemos ver o nome da estatística no showplan XML.
Vou descartar a estatística e criar um índice filtrado e não agrupado com a mesma definição (que também criou as estatísticas)
Podemos verificar o índice e as estatísticas com esta consulta DMO:
Observe que o
sys.stats
DMV não possui uma coluna is_disabledExecutar novamente a consulta nos mostra que a estatística nomeada mudou de BikeWeights para IX_Product_BikeWeights .
Agora , desativarei o índice e executarei novamente o DMO e as consultas de teste.
As estatísticas ainda estão sendo usadas mesmo quando o índice está desabilitado .
Para a execução final, vamos descartar o índice (que também descarta as estatísticas)
As estatísticas também estão faltando.