Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verursacht das Umschließen von Nullable-Spalten in ISNULL Tabellenscans?

Ja, es verursacht Tabellenscans. (scheint aber optimiert zu werden, wenn die Spalte nicht wirklich nullable ist)

Der SR0007 Die Regel ist ein äußerst schlechter Pauschalratschlag, da sie das Prädikat unsagbar macht und bedeutet, dass alle Indizes für die Spalte nutzlos sind. Selbst wenn die Spalte keinen Index enthält, kann dies dazu führen, dass die Kardinalitätsschätzungen ungenau sind und sich auf andere Teile des Plans auswirken.

Die Kategorisierung davon in der Microsoft.Performance Kategorie ist ziemlich amüsant, da sie anscheinend von jemandem geschrieben wurde, der kein Verständnis für die Abfrageleistung hat.

Es behauptet, die Begründung sei

Während der Ausdruck selbst zu unknown ausgewertet wird Ihr Code gibt ein vollständig deterministisches Ergebnis zurück, sobald Sie verstehen, dass = , <> , > , < etc Vergleich mit NULL als Unknown auswerten und dass das WHERE -Klausel gibt nur Zeilen zurück, in denen der Ausdruck als true ausgewertet wird .

Es ist möglich, dass sie bedeuten, wenn ANSI_NULLS ist ausgeschaltet, aber das Beispiel, das sie in der Dokumentation von WHERE ISNULL([c2],0) > 2; geben vs WHERE [c2] > 2; wäre von dieser Einstellung sowieso nicht betroffen. Diese Einstellung

Ausführungspläne, die Scans im Vergleich zu Seek oder darunter zeigen

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