Saya memiliki kasus di mana menggunakan GABUNGAN atau IN akan memberi saya hasil yang benar ... Yang biasanya memiliki kinerja lebih baik dan mengapa? Berapa tergantung pada server database apa yang Anda jalankan? (FYI saya menggunakan MSSQL)
sql
sql-server
performance
tsql
Polaris878
sumber
sumber
Jawaban:
Secara umum,
IN
danJOIN
berbagai pertanyaan yang dapat menghasilkan hasil yang berbeda.tidak sama dengan
, kecuali
b.col
unik.Namun, ini adalah sinonim untuk kueri pertama:
Jika kolom bergabung adalah
UNIQUE
dan ditandai seperti itu, kedua permintaan ini menghasilkan paket yang sama diSQL Server
.Jika tidak, maka
IN
lebih cepat dariJOIN
padaDISTINCT
.Lihat artikel ini di blog saya untuk detail kinerja:
IN
vs.JOIN
vs.EXISTS
sumber
IN
menyiratkanDISTINCT
.SQL Server
cukup cerdas untuk menyadarinya, dan akan menghasilkan rencana yang sama untuk kedua pertanyaan. Namun, tidak yakin bagaimanaRDBMS
perilaku orang lain.Lucu Anda menyebutkan bahwa, saya melakukan posting blog tentang hal ini.
Lihat Oracle vs MySQL vs SQL Server: Agregasi vs Bergabung
Jawaban singkat: Anda harus mengujinya dan database individual sangat bervariasi.
sumber
Itu agak sulit dikatakan - untuk benar-benar mengetahui mana yang bekerja lebih baik, Anda harus benar-benar membuat profil waktu eksekusi.
Sebagai aturan umum, saya pikir jika Anda memiliki indeks pada kolom kunci asing Anda, dan jika Anda hanya menggunakan kondisi INNER JOIN, maka JOIN akan sedikit lebih cepat.
Tetapi begitu Anda mulai menggunakan OUTER JOIN, atau jika Anda tidak memiliki indeks kunci asing, IN mungkin lebih cepat.
Marc
sumber
Langgan menarik pada perbedaan logis: SQL Server: BERGABUNG vs DALAM vs ADA - perbedaan logis
Saya cukup yakin bahwa dengan asumsi bahwa hubungan dan indeks dipertahankan, Gabung akan berkinerja lebih baik secara keseluruhan (lebih banyak upaya untuk bekerja dengan operasi itu daripada yang lain). Jika Anda memikirkannya secara konseptual maka perbedaannya antara 2 kueri dan 1 kueri.
Anda perlu menghubungkannya ke Query Analyzer dan mencobanya dan lihat perbedaannya. Lihat juga Rencana Eksekusi Kueri dan cobalah untuk meminimalkan langkah-langkah.
sumber
Utas ini cukup lama tetapi masih sering disebutkan. Untuk selera pribadi saya itu agak tidak lengkap, karena ada cara lain untuk meminta database dengan kata kunci yang ada yang saya temukan lebih cepat lebih sering daripada tidak.
Jadi, jika Anda hanya tertarik pada nilai dari tabel, Anda dapat menggunakan kueri ini:
Perbedaannya mungkin besar jika col tidak diindeks, karena db tidak harus menemukan semua catatan dalam b yang memiliki nilai yang sama dalam col, hanya harus menemukan yang pertama. Jika tidak ada indeks pada b.col dan banyak catatan dalam pemindaian tabel ba mungkin konsekuensinya. Dengan IN atau GABUNG, ini akan menjadi pemindaian tabel penuh, dengan EXISTS ini hanya pemindaian tabel parsial (sampai catatan pencocokan pertama ditemukan).
Jika ada banyak catatan dalam b yang memiliki nilai col yang sama Anda juga akan membuang banyak memori untuk membaca semua catatan ini dalam ruang sementara hanya untuk menemukan bahwa kondisi Anda terpenuhi. Dengan adanya ini biasanya dapat dihindari.
Saya sering menemukan EXIS lebih cepat daripada DI walaupun ada indeks. Itu tergantung pada sistem basis data (pengoptimal), data dan terakhir pada jenis indeks yang digunakan.
sumber
Setiap implementasi database tetapi Anda mungkin dapat menebak bahwa mereka semua memecahkan masalah umum dengan cara yang kurang lebih sama. Jika Anda menggunakan MSSQL, lihatlah rencana eksekusi yang dihasilkan. Anda dapat melakukan ini dengan menyalakan profiler dan rencana eksekusi. Ini akan memberi Anda versi teks saat Anda menjalankan perintah.
Saya tidak yakin apa versi MSSQL yang Anda gunakan tetapi Anda bisa mendapatkan yang grafis di SQL Server 2000 di penganalisis kueri. Saya yakin bahwa fungsi ini mengintai di SQL Server Studio Manager di versi yang lebih baru.
Lihatlah rencana pengeluarannya. Sedapat mungkin hindari pemindaian tabel kecuali tentu saja meja Anda kecil dalam hal pemindaian tabel lebih cepat daripada menggunakan indeks. Baca tentang berbagai operasi gabungan yang dihasilkan setiap skenario.
sumber
Pengoptimal harus cukup pintar untuk memberikan Anda hasil yang sama baik untuk kueri normal. Periksa rencana eksekusi dan mereka harus memberi Anda hal yang sama. Jika tidak, saya biasanya akan menganggap GABUNG lebih cepat. Semua sistem berbeda, jadi Anda harus memastikan kode pada sistem Anda.
sumber