Suponha que temos uma definição de tabela como esta:
CREATE TABLE MyTab (
ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
,GroupByColumn NVARCHAR(10) NOT NULL
,WhereColumn DATETIME NULL
)
E um índice não clusterizado filtrado como este:
CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab
(GroupByColumn)
WHERE (WhereColumn IS NULL)
Por que este índice não está "cobrindo" para esta consulta:
SELECT
GroupByColumn
,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
Estou recebendo este plano de execução:
O KeyLookup é para o predicado WhereColumn IS NULL.
Aqui está o plano: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7
Nenhuma boa razão. Esse é um índice de cobertura para essa consulta.
Por favor, vote no item de feedback aqui: https://feedback.azure.com/d365community/idea/ffbf409a-5125-ec11-b6e6-000d3a4f0da0
E como solução alternativa , inclua o
WhereColumn
no índice filtrado:Eu tive o mesmo problema, acho que ao fazer alguns testes semanas atrás. Eu tenho uma consulta com um predicado primário que exige que os resultados retornados tenham um closedatetime NULL e pensei em usar um índice filtrado, pois 25K de 2M+ registros são NULL e esse número diminuirá muito em breve.
O índice filtrado não foi usado - eu assumi devido a 'não exclusividade' ou semelhança - até encontrar um artigo de suporte da Microsoft que diz:
Portanto, adicionar a coluna ao Índice (ou Incluir) parece ser a resposta oficial do MS.