Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy zawijanie kolumn dopuszczających wartość null w ISNULL powoduje skanowanie tabel?

Tak, powoduje skanowanie tabeli. (chociaż wydaje się, że jest zoptymalizowany, jeśli kolumna nie jest faktycznie dopuszczalna do wartości null)

SR0007 reguła jest wyjątkowo kiepską radą zbiorczą, ponieważ sprawia, że ​​predykat jest nie do argumentowania i oznacza, że ​​wszelkie indeksy w kolumnie będą bezużyteczne. Nawet jeśli nie ma indeksu w kolumnie, może to nadal powodować niedokładność szacunków kardynalności, co ma wpływ na inne części planu.

Kategoryzacja w Microsoft.Performance kategoria jest dość zabawna, ponieważ wydaje się, że została napisana przez kogoś, kto nie rozumie wydajności zapytań.

Twierdzi, że uzasadnienie to

Podczas gdy samo wyrażenie jest oceniane jako nieznane Twój kod zwraca całkowicie deterministyczny wynik, gdy zrozumiesz, że dowolny = , <> , > , < itp porównanie z NULL oceniać jako Nieznany i że GDZIE klauzula zwraca tylko wiersze, w których wyrażenie ma wartość prawda .

Możliwe, że mają na myśli, jeśli ANSI_NULLS jest wyłączony, ale przykład podany w dokumentacji WHERE ISNULL([c2],0)> 2; vs GDZIE [c2]> 2; i tak nie miałoby wpływu na to ustawienie. To ustawienie

Plany wykonania pokazujące skany w porównaniu z wyszukiwaniem lub poniżej

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykonywanie pakietu SSIS jako zadanie SQLAgent

  2. Wyrażenie regularne MSSQL

  3. Tymczasowe wyłączenie ograniczeń (MS SQL)

  4. Napraw „Przynajmniej jeden z argumentów COALESCE musi być wyrażeniem, które nie jest stałą NULL” w SQL Server

  5. Zwróć informacje o kolumnie dla procedury przechowywanej w programie SQL Server:sp_sproc_columns