Предположим, у нас есть определение таблицы следующим образом:
CREATE TABLE MyTab (
ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
,GroupByColumn NVARCHAR(10) NOT NULL
,WhereColumn DATETIME NULL
)
И отфильтрованный некластеризованный индекс, подобный этому:
CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab
(GroupByColumn)
WHERE (WhereColumn IS NULL)
Почему этот индекс не «покрывает» этот запрос:
SELECT
GroupByColumn
,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
Я получаю этот план выполнения:
KeyLookup предназначен для предиката WhereColumn IS NULL.
Вот план: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7
У меня была та же проблема, что и при тестировании несколько недель назад. У меня есть запрос с основным предикатом, который требует, чтобы возвращаемые результаты имели NULL закрытое время, и я подумал об использовании отфильтрованного индекса, так как 25K записей 2M + равны NULL, и этот показатель очень скоро уменьшится.
Отфильтрованный индекс не использовался - я предположил из-за «неуникальности» или общности - пока не нашел статью поддержки Microsoft, в которой говорится:
Поэтому добавление столбца в указатель (или включение) представляется официальным ответом MS.
источник