Di antara beberapa pengembang SQL Server, ini adalah kepercayaan luas yang NOT IN
sangat lambat , dan pertanyaan harus ditulis ulang sehingga mereka memberikan hasil yang sama tetapi tidak menggunakan kata kunci "jahat". ( contoh ).
Apakah ada kebenarannya?
Apakah ada, misalnya, beberapa bug yang dikenal di SQL Server (versi mana?) Yang menyebabkan kueri menggunakan NOT IN
memiliki rencana eksekusi yang lebih buruk daripada kueri setara yang menggunakan
- a
LEFT JOIN
dikombinasikan denganNULL
cek atau (SELECT COUNT(*) ...) = 0
dalamWHERE
klausa?
sql-server
query-performance
except
Heinzi
sumber
sumber
IN
/NOT IN
akan selalu diimplementasikan dengan loop bersarang. Dan saya tidak tahu apastops SQL Server from creating a ‘plan’
yang dimaksudkan.Jawaban:
Saya tidak berpikir itu ada hubungannya dengan menjadi sangat lambat; itu ada hubungannya dengan menjadi berpotensi tidak akurat. Misalnya, diberi data berikut - pesanan yang dapat ditempatkan baik oleh pelanggan individu, atau mitra B2B:
Katakanlah saya ingin menemukan semua pelanggan yang belum pernah melakukan pemesanan. Mengingat data, hanya ada satu: pelanggan # 2. Berikut adalah tiga cara yang dapat saya lakukan untuk menulis kueri untuk menemukan informasi itu (ada yang lain):
Hasil:
Sekarang, ada beberapa masalah kinerja juga, dan saya membicarakannya di posting blog ini . Tergantung pada data dan indeks,
NOT EXISTS
biasanya akan mengungguliNOT IN
, dan saya tidak tahu apakah itu bisa berkinerja lebih buruk. Anda juga harus mencatat bahwaEXCEPT
dapat memperkenalkan operasi penyortiran yang berbeda, sehingga Anda dapat berakhir dengan data yang berbeda (sekali lagi, tergantung pada sumbernya). Dan bahwaLEFT OUTER JOIN ... WHERE right.column IS NULL
pola populer selalu merupakan yang terburuk.Martin Smith juga memiliki banyak informasi pendukung yang bagus dalam jawabannya di SO .
sumber