Estou tentando aprender sobre a cobertura de índices. No banco de dados Northwind, seleciono na tabela Categories :
Como você pode ver, a tabela possui um índice não clusterizado na coluna CategoryName .
Esta consulta SQL:
select CategoryName from Categories where Categories.CategoryName like 'Beverages'
retorna um plano de execução com uma busca de índice:
No entanto, isso:
select CategoryName ,Description from Categories where Categories.CategoryName like 'Beverages'
retorna este plano de execução com uma verificação de índice usando o índice de chave primária, o que não é esperado:
Posso encontrar o comportamento esperado apenas quando forço a consulta com o índice não clusterizado:
select CategoryName ,Description from Categories
with(index(CategoryName))
where Categories.CategoryName like 'Beverages'
Qual é o problema?
Não há
Description
coluna em seu índice, mas há em sua consulta. Portanto, o SQL Server precisa obter essa coluna. Existem duas opções para fazer isso:Se suas estatísticas fizerem o SQL Server pensar que lerá muitos dados, o SQL Server fará uma escolha entre busca de índice não clusterizado + pesquisa de chave ou verificação de índice clusterizado, isso chamado ponto de inflexão.
Porque, se o SQL Server tiver que ler dados enormes, a verificação de índice clusterizado pode ser mais eficiente em vez de busca de índice não clusterizado + pesquisa de chave.
Há um bom post aqui no blog .
É porque o índice não clusterizado não inclui
Description
, portanto, não cobre a segunda consulta.As únicas duas opções são usar esse índice não clusterizado e, em seguida, fazer uma pesquisa de chave na chave primária (efetivamente o índice clusterizado neste caso) para obter o
Description
campo (duas operações) ou apenas usar o índice clusterizado desde o início para localizar e filtrar os dados, pois o Índice Agrupado inclui todos os campos (uma operação).Ele escolhe uma operação sobre a outra dependendo da diferença nos Custos do Operador no plano de execução, que varia de consulta para consulta e de conjunto de dados para conjunto de dados, dependendo de coisas como a Cardinalidade dos dados.
Isso é conhecido como O Ponto de Virada .
Se você alterou o índice não clusterizado para incluir o
Description
campo, ele deve usar o índice não clusterizado, em uma operação (nenhuma pesquisa de chave é necessária).Por exemplo: