Tak, powoduje skanowanie tabeli. (chociaż wydaje się, że jest zoptymalizowany, jeśli kolumna nie jest faktycznie dopuszczalna do wartości null)
SR0007 reguła jest wyjątkowo kiepską radą zbiorczą, ponieważ sprawia, że predykat jest nie do argumentowania i oznacza, że wszelkie indeksy w kolumnie będą bezużyteczne. Nawet jeśli nie ma indeksu w kolumnie, może to nadal powodować niedokładność szacunków kardynalności, co ma wpływ na inne części planu.
Kategoryzacja w Microsoft.Performance
kategoria jest dość zabawna, ponieważ wydaje się, że została napisana przez kogoś, kto nie rozumie wydajności zapytań.
Twierdzi, że uzasadnienie to
Podczas gdy samo wyrażenie jest oceniane jako nieznane
Twój kod zwraca całkowicie deterministyczny wynik, gdy zrozumiesz, że dowolny =
, <> ,
> ,
<
itp porównanie z NULL
oceniać jako Nieznany
i że GDZIE
klauzula zwraca tylko wiersze, w których wyrażenie ma wartość prawda
.
Możliwe, że mają na myśli, jeśli ANSI_NULLS
jest wyłączony, ale przykład podany w dokumentacji WHERE ISNULL([c2],0)> 2;
vs GDZIE [c2]> 2;
i tak nie miałoby wpływu na to ustawienie. To ustawienie
Plany wykonania pokazujące skany w porównaniu z wyszukiwaniem lub poniżej
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