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 agrupado e filtrado como este:
CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab
(GroupByColumn)
WHERE (WhereColumn IS NULL)
Por que esse índice não está "cobrindo" 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
Eu tive o mesmo problema que penso ao fazer alguns testes semanas atrás. Eu tenho uma consulta com um predicado primário que exige que os resultados retornados tenham um NULL fechado no tempo 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 - presumi que 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.
fonte