Eu tenho uma tabela grande (> 126 milhões de linhas) e uma necessidade de otimizar um conjunto especializado de consultas, então criei uma visualização indexada na tabela e codifiquei um procedimento que selecionaria na visualização indexada quando as condições fossem favoráveis para isto.
A execução do procedimento demorou mais do que eu esperava, então olhei o plano de execução, e vejo que a consulta que demora mais é a que seleciona na minha view, e quando passo o mouse sobre o elemento que demora mais é um Busca de Índice Agrupado do IC da tabela subjacente. Não o índice na exibição.
Eu entendi que uma exibição indexada era um tipo de tabela virtual que era armazenada em disco e que, quando consultada, não passava a consulta para a tabela subjacente. Não é este o caso?
O otimizador pode optar por usar a tabela subjacente (ela "expande" a exibição) com base em como ele escolhe implementar sua consulta. Para forçar a consulta a usar a exibição indexada, você pode adicionar uma
WITH (NOEXPAND)
dica àFROM
cláusula da consulta na qual a exibição é referenciada.Isso é útil por dois motivos:
A propósito, é recomendável usar essa dica independentemente ao referenciar exibições indexadas diretamente, para evitar outros comportamentos problemáticos. Veja este artigo de Paul White para obter detalhes: Visualizações e estatísticas indexadas