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

Apakah KECUALI dieksekusi lebih cepat daripada GABUNG ketika kolom tabel sama?

Tidak mungkin ada orang yang memberi tahu Anda bahwa EXCEPT akan selalu atau tidak pernah mengungguli OUTER JOIN yang setara . Pengoptimal akan memilih rencana eksekusi yang sesuai terlepas dari bagaimana Anda menulis maksud Anda.

Yang mengatakan, inilah pedoman saya:

Gunakan EXCEPT ketika setidaknya satu berikut ini benar:

  1. Kueri lebih mudah dibaca (hampir selalu benar).
  2. Kinerja ditingkatkan.

Dan DUANYA berikut ini benar:

  1. Kueri menghasilkan hasil yang identik secara semantik, dan Anda dapat menunjukkannya melalui pengujian regresi yang memadai, termasuk semua kasus tepi.
  2. Kinerja tidak menurun (sekali lagi, dalam semua kasus edge, serta perubahan lingkungan seperti membersihkan kumpulan buffer, memperbarui statistik, menghapus cache paket, dan memulai ulang layanan).

Penting untuk dicatat bahwa menulis EXCEPT yang setara dapat menjadi tantangan tersendiri kueri sebagai JOIN menjadi lebih kompleks dan/atau Anda mengandalkan duplikat di bagian kolom tetapi tidak yang lain. Menulis NOT EXISTS setara, sementara sedikit kurang dapat dibaca dari EXCEPT harus jauh lebih sepele untuk dicapai - dan akan sering mengarah pada rencana yang lebih baik (tetapi perhatikan bahwa saya tidak akan pernah mengatakan ALWAYS atau NEVER , kecuali dengan cara yang baru saja saya lakukan).

Dalam posting blog ini saya menunjukkan setidaknya satu kasus di mana EXCEPT diungguli oleh LEFT OUTER JOIN yang dibangun dengan benar dan tentu saja dengan NOT EXISTS yang setara variasi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. datetime vs smalldatetime di SQL Server:Apa Bedanya?

  2. Menemukan Induk Tingkat Teratas di SQL

  3. Anatomi kebuntuan SQL Server dan cara terbaik untuk menghindarinya

  4. SQL Server Setara dengan GROUP_CONCAT()

  5. Padding Kiri di SQL Server – 3 LPAD() Setara