IS NULL değerinde filtrelenmiş dizin neden kullanılmıyor?


18

Bunun gibi bir tablo tanımımız olduğunu varsayın:

CREATE TABLE MyTab (
    ID INT IDENTITY(1,1) CONSTRAINT PK_MyTab_ID PRIMARY KEY
    ,GroupByColumn NVARCHAR(10) NOT NULL
    ,WhereColumn DATETIME NULL
    )

Ve şu şekilde filtrelenmiş kümelenmemiş bir dizin:

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn ON MyTab 
    (GroupByColumn)
WHERE (WhereColumn IS NULL) 

Bu dizin neden bu sorgu için "kapsamıyor":

SELECT 
    GroupByColumn
    ,COUNT(*)
FROM MyTab
WHERE WhereColumn IS NULL
GROUP BY GroupByColumn

Bu yürütme planını alıyorum:

resim açıklamasını buraya girin

KeyLookup WhereColumn IS NULL yüklemidir.

Plan şu şekildedir: https://www.brentozar.com/pastetheplan/?id=SJcbLHxO7

Yanıtlar:


23

Bu dizin neden bu sorgu için "kapsamıyor":

İyi bir sebep yok. Bu sorgu için bir kaplama dizini.

Lütfen geri bildirim maddesine oy verin: https://feedback.azure.com/forums/908035-sql-server/suggestions/32896348-filtered-index-not-used-when-is-null-and-key-looku

Ve geçici bir çözüm olarak WhereColumn, filtrelenmiş dizine şunu ekleyin :

CREATE NONCLUSTERED INDEX IX_MyTab_GroupByColumn 
ON MyTab (GroupByColumn) include (WhereColumn)
WHERE (WhereColumn IS NULL) 

13
Bu, on yıl önce Gail Shaw tarafından bildirildi . Sonra Connect öldü. Şimdi bulabildiğim en yakın şey feedback.azure.com/forums/908035-sql-server/suggestions/…
Paul White 9

3

Birkaç hafta önce test yaparken de aynı sorunu yaşadım. Döndürülen sonuçların bir NULL closedatetime olmasını gerektiren bir birincil yüklem ile bir sorgu var ve 2K + kayıtları 25K NULL olarak filtrelenmiş bir dizin kullanmayı düşündüm ve bu rakam çok yakında azalacaktır.

Filtrelenmiş dizin, 'benzersiz olmayan' veya ortak özellik nedeniyle varsayıldım - şu şekilde bir Microsoft destek makalesi bulana kadar kullanılmadı :

Bu sorunu gidermek için, döndürülen sütunlara NULL olarak sınanmış sütunu ekleyin. Veya bu sütunu dizine ekleme sütunları olarak ekleyin.

Bu nedenle, Dizin'e (veya Dahil Etme) sütun eklemek resmi MS yanıtı gibi görünüyor.


1
Bu, ne zaman (ve eğer) çözene kadar geçerli bir çözümdür.
ypercubeᵀᴹ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.