SR0004: IN 述語で、インデックスがない列をテスト式として使用しないでください
規則 ID |
SR0004 |
分類 |
Microsoft.Performance |
互換性に影響する変更点 |
なし |
原因
IN 述語が、インデックスを持たない列を参照します。
規則の説明
IN 述語の一部としてインデックス付けされていない 1 つ以上の列を参照する WHERE 句を使用すると、テーブル スキャンが実行されます。 テーブル スキャンが実行されると、パフォーマンスが低下します。
違反の修正方法
この問題を解決するには、次の変更のいずれかを行う必要があります。
インデックスを持つ列だけを参照するように、IN 述語を変更します。
IN 述語が参照する、インデックスを持っていない列に、インデックスを追加します。
警告を抑制する状況
テーブルに多数の行が含まれることがない場合、この警告を抑制できます。
使用例
この例では、単純な SELECT ステートメントが、インデックスを持たない列 [c1] を参照します。 2 番目のステートメントは、この警告を解決するために追加するインデックスを定義します。
CREATE PROCEDURE [dbo].[Procedure3WithWarnings]
AS
SELECT [Comment]
FROM [dbo].[Table2]
WHERE [c1] IN (1, 2, 3)
CREATE INDEX [IX_Table2_C1]
ON [dbo].[Table2] (c1);