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:
- Kueri lebih mudah dibaca (hampir selalu benar).
- Kinerja ditingkatkan.
Dan DUANYA berikut ini benar:
- Kueri menghasilkan hasil yang identik secara semantik, dan Anda dapat menunjukkannya melalui pengujian regresi yang memadai, termasuk semua kasus tepi.
- 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.