はい、テーブルスキャンが発生します。 (ただし、列が実際に null 可能でない場合は最適化されるようです)
SR0007 ルールは、述語を検索不能にし、列のインデックスが役に立たなくなることを意味するため、非常に貧弱な包括的なアドバイスです。列にインデックスがない場合でも、カーディナリティの見積もりが不正確になり、計画の他の部分に影響を与える可能性があります。
Microsoft.Performance
での分類 カテゴリは、クエリのパフォーマンスを理解していない人によって書かれたようで、非常に面白いです.
論理的根拠は
であると主張しています
式自体は unknown
と評価されますが、 =
であることを理解すると、コードは完全に決定論的な結果を返します。 、 <>コード> 、
>コード> 、
<コード>
NULL
との比較など 不明
と評価 そしてその WHERE
句は、式が true
と評価される行のみを返します .
ANSI_NULLS
オフですが、 WHERE ISNULL([c2],0)> 2;
のドキュメントで提供されている例 vs WHERE [c2]> 2;
とにかく、この設定の影響を受けません。この設定
スキャン vs シーク以下を示す実行計画
CREATE TABLE #foo
(
x INT NULL UNIQUE
)
INSERT INTO #foo
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM sys.all_columns
SELECT *
FROM #foo
WHERE ISNULL(x, 10) = 10
SELECT *
FROM #foo
WHERE x = 10
SELECT *
FROM #foo
WHERE x = 10
OR x IS NULL