Ja det forårsager tabelscanninger. (selvom det ser ud til at blive optimeret, hvis kolonnen faktisk ikke er nullbar)
SR0007 reglen er ekstremt dårlig generel rådgivning, da den gør prædikatet unsargerbart og betyder, at alle indekser på kolonnen vil være ubrugelige. Selvom der ikke er noget indeks på kolonnen, kan det stadig gøre kardinalitetsestimater unøjagtige, hvilket påvirker andre dele af planen.
Kategoriseringen af det i Microsoft.Performance
kategorien er ret morsom, da den ser ud til at være skrevet af en person uden forståelse for forespørgselsydelse.
Den hævder, at begrundelsen er
Mens selve udtrykket evalueres til ukendt
din kode returnerer et fuldstændigt deterministisk resultat, når du forstår, at enhver =
, <> ,
> ,
<
osv. sammenligning med NULL
evaluere som Ukendt
og at WHERE
klausul returnerer kun rækker, hvor udtrykket evalueres til true
.
Det er muligt, at de betyder, hvis ANSI_NULLS
er slået fra, men eksemplet de giver i dokumentationen for WHERE ISNULL([c2],0)> 2;
vs WHERE [c2]> 2;
vil alligevel ikke blive påvirket af denne indstilling. Denne indstilling
Udførelsesplaner, der viser scanninger vs. søgning eller derunder
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