sql >> Database teknologi >  >> RDS >> Sqlserver

Medfører ombrydning af nullbare kolonner i ISNULL tabelscanninger?

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 




  1. SQL-forespørgsel til udførelse af radiussøgning baseret på breddegrad

  2. Datagenerering og hardwarekvalitet

  3. Hvad er nyt i ProxySQL 2.0

  4. Stof og Sudo som en anden bruger