IS NULL値のフィルター選択されたインデックスが使用されないのはなぜですか?


18

次のようなテーブル定義があると仮定します。

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

そして、次のようなフィルター処理された非クラスター化インデックス:

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

このインデックスがこのクエリで「カバー」されていない理由:

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

私はこの実行計画を取得しています:

ここに画像の説明を入力してください

KeyLookupは、WhereColumn IS NULL述語用です。

計画は次のとおりです。https//www.brentozar.com/pastetheplan/?id = SJcbLHxO7

回答:


23

このインデックスがこのクエリで「カバー」されていない理由:

正当な理由はありません。これは、そのクエリのカバーインデックスです。

こちらの有料アイテムに投票してください: https

そしてような回避策が含まWhereColumnフィルターインデックスに:

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

13
これは10年以上前にゲイルショーによって報告されました。その後、接続が停止しました。私が今見つけることができる最も近いですfeedback.azure.com/forums/908035-sql-server/suggestions/...
ポール・ホワイト9

3

数週間前にいくつかのテストを行ったときと同じ問題がありました。返された結果にNULL closedatetimeが必要なプライマリ述語を使用したクエリがあり、25Kの2M +レコードが25Kであり、この数値はすぐに減少するため、フィルター選択されたインデックスを使用することを考えました。

フィルター処理されたインデックスは使用されませんでした-「非一意性」または共通性のために- マイクロソフトのサポート記事を見つけるまで:

この問題を解決するには、返される列にNULLとしてテストされている列を含めます。または、この列をインデックスに含める列として追加します。

したがって、列をインデックスに追加(またはインクルード)することは、公式のMS応答のようです。


1
修正するまで(および修正するまで)実行可能な回避策です。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.