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);

参照

概念

データベース コードの分析によるコードの品質の向上