この記事は、SQL Server で Column IS NULL
述語式と共にインデックスを作成するときに発生する問題を解決するのに役立ちます。
元の製品バージョン: SQL Server
元の KB 番号: 3051225
現象
以下のシナリオについて考えてみます。
- SQL Server では、フィルター選択されたインデックスを
Column IS NULL
述語式と共に作成します。 - Column フィールドはインデックス構造に含まれません。 (つまり、 列 フィールドは、フィルター選択されたインデックス定義にキーまたは含まれる列ではありません。
たとえば、次のクエリを作成します。
CREATE UNIQUE CLUSTERED INDEX i_action_rn ON dbo.filter_test (rn)
CREATE NONCLUSTERED INDEX i_action_filt_action_date_type ON dbo.filter_test (action_type)
WHERE action_date IS NULL
Note
このクエリでは、次のフィルター選択されたインデックスは使用されません。
SELECT count(*) FROM dbo.filter_test WHERE action_date IS NULL AND action_type=1
このシナリオでは、フィルター選択されたインデックスは使用されません。 代わりに、クラスター化インデックスが使用されます。
解決方法
この問題を解決するには、返される列に NULL としてテストされる列を含めます。 または、インデックスに含める列としてこの列を追加します。
CREATE NONCLUSTERED INDEX New_i_action_filt_action_date_type ON dbo.filter_test (action_type) include (action_date) WHERE action_date IS NULL