Ano, způsobuje skenování tabulek. (i když se zdá, že se optimalizuje, pokud sloupec ve skutečnosti nemá hodnotu null)
SR0007 pravidlo je extrémně špatná obecná rada, protože činí predikát neměnitelným a znamená, že jakékoli indexy ve sloupci budou k ničemu. I když ve sloupci není žádný index, může se stát, že odhady mohutnosti budou nepřesné a ovlivní ostatní části plánu.
Jeho kategorizace v Microsoft.Performance
kategorie je docela zábavná, protože se zdá, že ji napsal někdo, kdo nerozumí výkonu dotazů.
Tvrdí, že zdůvodnění je
Zatímco samotný výraz se vyhodnotí jako unknown
váš kód vrátí zcela deterministický výsledek, jakmile pochopíte, že jakýkoli =
, <>
, >
, <
atd. srovnání s NULL
vyhodnotit jako Unknown
a že WHERE
klauzule vrací pouze řádky, kde je výraz vyhodnocen jako true
.
Je možné, že znamenají, pokud ANSI_NULLS
je vypnutý, ale příklad, který uvádějí v dokumentaci WHERE ISNULL([c2],0) > 2;
vs WHERE [c2] > 2;
by toto nastavení stejně neovlivnilo. Toto nastavení
Prováděcí plány zobrazující skeny vs hledání nebo níže
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