Angenommen, wir haben eine Tabellendefinition wie diese:
CREATE TABLE MyTab (
ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
,GroupByColumn NVARCHAR(10) NOT NULL
,WhereColumn DATETIME NULL
)
Und ein gefilterter nicht gruppierter Index wie dieser:
CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab
(GroupByColumn)
WHERE (WhereColumn IS NULL)
Warum dieser Index diese Abfrage nicht "abdeckt":
SELECT
GroupByColumn
,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
Ich erhalte diesen Ausführungsplan:
Das KeyLookup ist für das Vergleichselement WhereColumn IS NULL.
Hier ist der Plan: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7
Ich hatte das gleiche Problem wie vor einigen Testwochen. Ich habe eine Abfrage mit einem primären Prädikat, die erfordert, dass die zurückgegebenen Ergebnisse eine NULL-Closedatetime haben, und ich habe darüber nachgedacht, einen gefilterten Index zu verwenden, da 25.000 von 2 Millionen Datensätzen NULL sind und diese Zahl sehr bald abnehmen wird.
Der gefilterte Index wurde erst verwendet, nachdem ich einen Microsoft-Support-Artikel gefunden hatte , in dem Folgendes angegeben ist:
Das Hinzufügen der Spalte zum Index (oder Include) scheint also die offizielle Antwort der MS zu sein.
quelle