Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Apakah membungkus kolom yang dapat dibatalkan di ISNULL menyebabkan pemindaian tabel?

Ya itu menyebabkan pemindaian tabel. (meskipun tampaknya dioptimalkan jika kolom sebenarnya tidak dapat dibatalkan)

SR0007 rule adalah saran selimut yang sangat buruk karena membuat predikat tidak dapat disarangkan dan berarti indeks apa pun pada kolom tidak akan berguna. Bahkan jika tidak ada indeks pada kolom itu mungkin masih membuat perkiraan kardinalitas tidak akurat yang mempengaruhi bagian lain dari rencana.

Kategorisasinya di Microsoft.Performance kategori cukup lucu karena tampaknya ditulis oleh seseorang yang tidak memahami kinerja kueri.

Ia mengklaim alasannya adalah

Sementara ekspresi itu sendiri mengevaluasi ke unknown kode Anda mengembalikan hasil yang sepenuhnya deterministik setelah Anda memahami bahwa = , <> , > , <> dll perbandingan dengan NULL evaluasi sebagai Unknown dan bahwa WHERE klausa hanya mengembalikan baris di mana ekspresi dievaluasi menjadi true .

Mungkin maksudnya jika ANSI_NULLS tidak aktif tetapi contoh yang mereka berikan dalam dokumentasi WHERE ISNULL([c2],0) > 2; vs WHERE [c2] > 2; tidak akan terpengaruh oleh pengaturan ini. Pengaturan ini

Rencana eksekusi yang menunjukkan pemindaian vs pencarian atau lebih rendah

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. Petunjuk kunci tabel default pada SQL Server 2005/2008

  2. Kapan menggunakan KECUALI sebagai lawan NOT EXISTS di Transact SQL?

  3. Bagaimana cara menjalankan paket SSIS dari .NET?

  4. Temukan Paket SSIS tanggal terakhir diubah/dikerahkan - SQL Server

  5. Bagaimana cara membuat kueri loop sql untuk memeriksa perbedaan antara nilai?