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

Il wrapping di colonne nullable in ISNULL causa scansioni di tabelle?

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