Sì, provoca scansioni della tabella. (anche se sembra essere ottimizzato se la colonna non è effettivamente nullable)
Il SR0007 la regola è un consiglio generale estremamente scarso in quanto rende il predicato non adattabile e significa che qualsiasi indice sulla colonna sarà inutile. Anche se non è presente alcun indice sulla colonna, le stime di cardinalità potrebbero comunque rendere imprecise con ripercussioni su altre parti del piano.
La sua categorizzazione in Microsoft.Performance
categoria è piuttosto divertente in quanto sembra essere stata scritta da qualcuno che non conosce le prestazioni delle query.
Afferma che la logica è
Mentre l'espressione stessa restituisce unknown
il tuo codice restituisce un risultato completamente deterministico una volta compreso che qualsiasi =
, <>
, >
, <
ecc confronto con NULL
valuta come Unknown
e che il WHERE
La clausola restituisce solo le righe in cui l'espressione restituisce true
.
È possibile che intendano if ANSI_NULLS
è spento ma l'esempio che danno nella documentazione di WHERE ISNULL([c2],0) > 2;
vs WHERE [c2] > 2;
non sarebbe comunque influenzato da questa impostazione. Questa impostazione
Piani di esecuzione che mostrano scansioni e ricerche o inferiori
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