Załóżmy, że mamy taką definicję tabeli:
CREATE TABLE MyTab (
ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
,GroupByColumn NVARCHAR(10) NOT NULL
,WhereColumn DATETIME NULL
)
I filtrowany indeks nieklastrowany taki jak ten:
CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab
(GroupByColumn)
WHERE (WhereColumn IS NULL)
Dlaczego ten indeks nie „obejmuje” tego zapytania:
SELECT
GroupByColumn
,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
Otrzymuję ten plan wykonania:
KeyLookup dotyczy predykatu WhereColumn IS NULL.
Oto plan: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7
Wydaje mi się, że miałem ten sam problem podczas testów kilka tygodni temu. Mam zapytanie z pierwotnym predykatem, które wymaga, aby zwrócone wyniki miały NULL closedatetime i pomyślałem o użyciu filtrowanego indeksu, ponieważ 25 000 rekordów 2M + ma wartość NULL, a liczba ta wkrótce spadnie.
Filtrowany indeks nie został wykorzystany - zakładałem z powodu „niejednorodności” lub powszechności - dopóki nie znalazłem artykułu pomocy technicznej Microsoft, który mówi:
Tak więc dodanie kolumny do Indeksu (lub Uwzględnij) wydaje się być oficjalną odpowiedzią stwardnienia rozsianego.
źródło