Asumsikan kita memiliki definisi tabel seperti ini:
CREATE TABLE MyTab (
ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
,GroupByColumn NVARCHAR(10) NOT NULL
,WhereColumn DATETIME NULL
)
Dan indeks non-clustered yang disaring seperti ini:
CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab
(GroupByColumn)
WHERE (WhereColumn IS NULL)
Mengapa indeks ini tidak "mencakup" untuk permintaan ini:
SELECT
GroupByColumn
,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn
Saya mendapatkan rencana eksekusi ini:
KeyLookup adalah untuk predikat WhereColumn IS NULL.
Inilah rencananya: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7
Saya memiliki masalah yang sama yang saya pikir ketika melakukan beberapa pengujian minggu lalu. Saya punya pertanyaan dengan predikat utama yang mensyaratkan bahwa hasil yang dikembalikan memiliki NULL closedatetime dan saya berpikir untuk menggunakan indeks yang difilter karena 25K dari catatan 2M + adalah NULL dan angka ini akan berkurang segera.
Indeks yang difilter tidak digunakan - saya berasumsi karena 'non-keunikan' atau kesamaan - sampai saya menemukan artikel dukungan Microsoft yang mengatakan:
Jadi menambahkan kolom ke Indeks (atau Sertakan) tampaknya menjadi respons MS resmi.
sumber