Prestasi Pelayan SQL: LEFT OUTER JOIN vs. NOT WUJUD
Dilema:
Apabila menavigasi set data , anda mungkin perlu mendapatkan semula rekod yang terdapat dalam jadual A tetapi tiada dalam jadual B. Untuk ini, dua pilihan timbul: LEFT OUTER JOIN atau TIDAK WUJUD. Memandangkan SQL Server memihak kepada pematuhan ANSI, adakah pengendali ANSI JOIN menawarkan prestasi unggul dalam senario ini? Adakah pengendali menyertai sememangnya lebih cekap daripada TIDAK WUJUD dalam SQL Server?
Jawapan:
Walaupun cerapan Joe dan Quassnoi memberikan konteks yang berharga, mari kita mendalami perbezaan prestasi:
TIDAK WUJUD lwn. LEFT OUTER JOIN Prestasi:
-
Pengindeksan: Jika medan yang terlibat diindeks secukupnya, NOT EXISTS selalunya berprestasi lebih baik, terutamanya apabila sejumlah besar rekod sepadan dengan subquery (iaitu, wujud dalam jadual B).
-
Litar pintas: Kedua-duanya WUJUD dan TIDAK WUJUD litar pintas, bermakna sebaik sahaja rekod memenuhi kriteria, ia disertakan atau dikecualikan daripada keputusan, membolehkan pengoptimum beralih ke rekod seterusnya.
-
Penggunaan sumber: LEFT OUTER JOIN menyertai semua rekod, tidak kira sama ada ia sepadan dan kemudian menapis bukan padanan. Proses ini boleh menjadi intensif sumber untuk jadual besar atau kriteria cantuman berbilang.
Cadangan:
Secara amnya, keutamaan hendaklah:
- Gunakan NOT EXISTS (atau setara, NOT IN) di mana mungkin disebabkan litar pintas yang dijamin dan berpotensi peningkatan prestasi.
-
Pertimbangkan LEFT OUTER JOIN apabila:
- Anda perlu mengekalkan semua rekod daripada kedua-dua jadual, walaupun ia tidak sepadan.
- Subkueri melibatkan kriteria yang kompleks atau gabungan yang banyak, menjadikannya tidak cekap untuk menggunakan NOT WUJUD.
Atas ialah kandungan terperinci LEFT OUTER JOIN lwn. NOT WUJUD dalam SQL Server: Mana yang Berprestasi Lebih Baik untuk Mencari Rekod Hilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!