Dlaczego filtrowany indeks wartości IS NULL nie jest używany?

18

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:

wprowadź opis zdjęcia tutaj

KeyLookup dotyczy predykatu WhereColumn IS NULL.

Oto plan: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7

jerik1
źródło

Odpowiedzi:

23

Dlaczego ten indeks nie „obejmuje” tego zapytania:

Bez dobrego powodu. To indeks obejmujący to zapytanie.

Głosuj na element słaby tutaj: https://feedback.azure.com/forums/908035-sql-server/suggestions/32896348-filtered-index-not-used-when-is-null-and-key-looku

Jako obejście należy uwzględnić WhereColumnw filtrowanym indeksie:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn 
ON MyTab (GroupByColumn) include (WhereColumn)
WHERE (WhereColumn IS NULL) 
David Browne - Microsoft
źródło
13
Zostało to zgłoszone ponad dziesięć lat temu przez Gail Shaw. Potem Connect umarł. Najbliżej mogę teraz znaleźć feedback.azure.com/forums/908035-sql-server/suggestions/…
Paul White 9
3

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:

Aby rozwiązać ten problem, dołącz kolumnę, która jest testowana jako NULL w zwróconych kolumnach. Lub dodaj tę kolumnę jako uwzględnij kolumny w indeksie.

Tak więc dodanie kolumny do Indeksu (lub Uwzględnij) wydaje się być oficjalną odpowiedzią stwardnienia rozsianego.

SteveO
źródło
1
Jest to realne obejście, dopóki nie zostaną naprawione.
ypercubeᵀᴹ