Em parte por curiosidade, me perguntei se poderia usar uma exibição indexada (materializada) para acelerar uma consulta de contagem em alguma tabela base.
A consulta é algo como
SELECT COUNT(*)
FROM BaseTable
WHERE Slot = ?;
então eu criei uma visão
CREATE VIEW IndexedView
WITH SCHEMABINDING AS
SELECT bt.Slot, COUNT_BIG(*) AS COUNT
FROM dbo.BaseTable bt
GROUP BY bt.Slot;
com um índice agrupado
CREATE UNIQUE CLUSTERED INDEX IX_Main
ON IndexedView (Slot);
E isso funciona, agora posso escrever a consulta original como
SELECT COUNT
FROM IndexedView
WHERE Slot = ?
e obter o resultado desejado muito mais rápido.
Infelizmente, dificilmente é muito útil para mim, pois minhas consultas geralmente não são feitas à mão. Eu realmente preciso que a consulta original se torne mais rápida usando a exibição indexada como uma espécie de índice para BaseTable
- e acho que li em algum lugar que isso pode acontecer em algumas circunstâncias, mas de acordo com meus testes, não neste.
Então minha(s) pergunta(s) seria(m):
- As exibições indexadas ainda podem me ajudar neste cenário de alguma forma?
- Alguém pode recomendar fontes/literatura que explique em quais casos as exibições indexadas são usadas para otimizações de consultas nas tabelas em que se baseiam?
EDIT: Na pergunta duplicada - estou mais interessado no GROUP BY e no aspecto agregado de exibições indexadas. A resposta me ajudou a encontrar um erro estúpido que cometi, agora está funcionando para mim também.
JOYOUS ADDENDUM : Agora que funcionou, testei com sucesso que funciona até mesmo nos casos em que a consulta contém uma junção à esquerda naqueles casos em que a junção à esquerda pode de fato ser otimizada (ou seja, a cláusula on cobre um índice exclusivo na tabela unida).
Isso é realmente incrível, porque significa que, mesmo em casos de consulta com junções à esquerda, é possível projetar o esquema de forma que obter uma contagem total de linhas de tudo ou agrupamentos específicos seja rápido.
O recurso é chamado de 'correspondência de visualização indexada' e pode ser complicado acertar. Há vários pré-requisitos descritos aqui: Resolução de índices em exibições , mais a exibição indexada precisa ser capaz de responder à pergunta que sua consulta está fazendo. Eu esperaria que funcionasse no Developer/Enterprise Edition para cenários diretos e consegui que funcionasse com um esquema e uma consulta simples:
Plano de execução:
Existem algumas outras consultas no meu script de teste acima e você pode ver que a exibição indexada não é usada para algumas delas.
Aqui estão algumas citações sobre exibições indexadas de um dos arquitetos do otimizador de consulta, Conor Cunningham:
mas ...
'Internos do Microsoft SQL Server 2008', Capítulo 8: O otimizador de consultas - Conor Cunningham
fonte
Acho que essas citações são bastante reveladoras. Você também pode querer considerar índices filtrados.