私はテーブルを持っています。それを と呼びましょうHistory
。主キー (別名クラスター化インデックス) は と呼ばれHIST_ID
ます。このテーブルには、開発 DB に約 2300 行あります。ここで、次の 2 つのクエリを検討してください。
クエリ 1:
declare @x int
set @x = 14289
select * from History where hist_id=@x
クエリ 2:
declare @x int
set @x = 14289
select * from History where hist_id=@x or @x is null
唯一の違いはor @x is null
、末尾にあります。ただし、最初のクエリはインデックス シークを実行し、2 番目のクエリはインデックス スキャンを実行します。何を与える?
先制応答 - いいえ、オプション (再コンパイル) は役に立ちません。
追加:推測ではなく、確固たる議論のある事実が欲しい. 私自身、これについて考えられる理由を十数個推測できます。しかし、ここで本当の問題は何ですか?