列のインデックスがオプティマイザーによって使用されるように、次のクエリを書き直す賢明な方法があるのだろうか?
CREATE PROCEDURE select_Proc1
@Key1 int=0,
@Key2 int=0
AS
BEGIN
SELECT key3
FROM Or_Table
WHERE (@key1 = 0 OR Key1 = @Key1) AND
(@key2 = 0 OR Key2 = @Key2)
END
GO
この記事によると、PreethivirajKulasinghamによるパラメータで使用される場合の「OR」句の使用を最適化する方法:
句の列は
WHERE
インデックスでカバーされていますが、SQLServerはこれらのインデックスを使用できません。これは、インデックスの使用を「ブロック」しているものがあるかどうかという疑問を提起します。この質問に対する答えは「はい」です。原因はパラメータとOR
条件です。パラメータはインデックスでカバーされていません。つまり、SQL Serverはどのインデックスも評価に使用できません
@key1=0
(この条件はにも適用されます@key2=0
)。事実上、これはSQL Serverがインデックスを使用して句を評価できないことを意味します
@key1=0 OR Key1= @key1
(OR
句は両方の条件でカバーされる行の結合であるため)。同じ原則が他の節(re。key2)にも当てはまります。これにより、SQL Serverは、行を抽出するためにインデックスを使用できないと結論付け、SQLServerは次善のアプローチであるクラスター化インデックススキャンを利用することになります。
ご覧のとおり、句で述語がOR
編集されている場合、SQLオプティマイザは列のインデックスを使用しません。WHERE
この問題の1つの解決策はIF
、パラメーターのすべての可能な組み合わせに対して句を使用してクエリを分離することです。
さて、私の質問は、可能な組み合わせが3つか4つ以上の場合、どうすればよいでしょうか。組み合わせごとに個別のクエリを作成することは、合理的な解決策とは思えません。
この問題に対する他の回避策はありますか?