Ja, es verursacht Tabellenscans. (scheint aber optimiert zu werden, wenn die Spalte nicht wirklich nullable ist)
Der SR0007 Die Regel ist ein äußerst schlechter Pauschalratschlag, da sie das Prädikat unsagbar macht und bedeutet, dass alle Indizes für die Spalte nutzlos sind. Selbst wenn die Spalte keinen Index enthält, kann dies dazu führen, dass die Kardinalitätsschätzungen ungenau sind und sich auf andere Teile des Plans auswirken.
Die Kategorisierung davon in der Microsoft.Performance
Kategorie ist ziemlich amüsant, da sie anscheinend von jemandem geschrieben wurde, der kein Verständnis für die Abfrageleistung hat.
Es behauptet, die Begründung sei
Während der Ausdruck selbst zu unknown
ausgewertet wird Ihr Code gibt ein vollständig deterministisches Ergebnis zurück, sobald Sie verstehen, dass =
, <>
, >
, <
etc Vergleich mit NULL
als Unknown
auswerten und dass das WHERE
-Klausel gibt nur Zeilen zurück, in denen der Ausdruck als true
ausgewertet wird .
Es ist möglich, dass sie bedeuten, wenn ANSI_NULLS
ist ausgeschaltet, aber das Beispiel, das sie in der Dokumentation von WHERE ISNULL([c2],0) > 2;
geben vs WHERE [c2] > 2;
wäre von dieser Einstellung sowieso nicht betroffen. Diese Einstellung
Ausführungspläne, die Scans im Vergleich zu Seek oder darunter zeigen
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