Ya itu menyebabkan pemindaian tabel. (meskipun tampaknya dioptimalkan jika kolom sebenarnya tidak dapat dibatalkan)
SR0007 rule adalah saran selimut yang sangat buruk karena membuat predikat tidak dapat disarangkan dan berarti indeks apa pun pada kolom tidak akan berguna. Bahkan jika tidak ada indeks pada kolom itu mungkin masih membuat perkiraan kardinalitas tidak akurat yang mempengaruhi bagian lain dari rencana.
Kategorisasinya di Microsoft.Performance
kategori cukup lucu karena tampaknya ditulis oleh seseorang yang tidak memahami kinerja kueri.
Ia mengklaim alasannya adalah
Sementara ekspresi itu sendiri mengevaluasi ke unknown
kode Anda mengembalikan hasil yang sepenuhnya deterministik setelah Anda memahami bahwa =
, <>
, >
, <>
dll perbandingan dengan NULL
evaluasi sebagai Unknown
dan bahwa WHERE
klausa hanya mengembalikan baris di mana ekspresi dievaluasi menjadi true
.
Mungkin maksudnya jika ANSI_NULLS
tidak aktif tetapi contoh yang mereka berikan dalam dokumentasi WHERE ISNULL([c2],0) > 2;
vs WHERE [c2] > 2;
tidak akan terpengaruh oleh pengaturan ini. Pengaturan ini
Rencana eksekusi yang menunjukkan pemindaian vs pencarian atau lebih rendah
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