次の方法で共有


IS NULL 述語と共に作成したフィルター選択されたインデックスは、SQL Server では使用されません

この記事は、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

フィルター選択されたインデックス シークが使用されていることを示す図。

詳細