Apakah ada perbedaan kinerja (dalam oracle) antara
Select * from Table1 T1
Inner Join Table2 T2 On T1.ID = T2.ID
Dan
Select * from Table1 T1, Table2 T2
Where T1.ID = T2.ID
?
sql
performance
oracle
juan
sumber
sumber
inner join ... on
kriteria bergabung dengan menempatkan setara dalamwhere
klausa.join
Jawaban:
Tidak! Rencana eksekusi yang sama, lihat dua tabel ini:
Rencana eksekusi untuk kueri menggunakan gabungan dalam:
Dan rencana eksekusi untuk kueri menggunakan klausa WHERE.
sumber
Jika pengoptimal kueri melakukan tugasnya dengan benar, seharusnya tidak ada perbedaan di antara kueri tersebut. Mereka hanya dua cara untuk menentukan hasil yang diinginkan yang sama.
sumber
JOIN
s lebih mudah dibaca karena kondisi untuk bergabung dengan tabel didefinisikan di sana segera daripada "suatu tempat" dalamWHERE
klausa. Saya lebih suka memesanWHERE
klausa untuk membatasi dataset (misalnyaWHERE DATE > (SYSDATE - 1)
) daripada juga mendefinisikan bagaimana tabel terkait satu sama lain (misalnyaWHERE T1.ID = T2.ID
). Untuk tabel kecil seperti contoh pada pertanyaan membuat sedikit perbedaan, tetapi untuk permintaan besar yang melibatkan beberapa tabel dan beberapa kondisi, saya pikir itu membuat kueri lebih mudah dimengerti.Mereka harus persis sama. Namun, sebagai praktik pengkodean, saya lebih suka melihat Bergabung. Itu jelas mengartikulasikan niat Anda,
sumber
Menggunakan
JOIN
membuat kode lebih mudah dibaca, karena cukup jelas.Tidak ada perbedaan kecepatan ( saya baru saja mengujinya ) dan rencana pelaksanaannya sama.
sumber
Saya tidak tahu tentang Oracle tetapi saya tahu bahwa sintaks lama sedang ditinggalkan dalam SQL Server dan akhirnya akan hilang. Sebelum saya menggunakan sintaks lama itu dalam sebuah kueri baru, saya akan memeriksa apa yang akan dilakukan Oracle.
Saya lebih suka sintaks yang lebih baru daripada pencampuran kriteria bergabung dengan kondisi tempat lain yang diperlukan. Dalam sintaks yang lebih baru, jauh lebih jelas apa yang membuat gabungan dan kondisi apa yang sedang diterapkan. Bukan masalah besar dalam kueri pendek seperti ini, tetapi akan jauh lebih membingungkan ketika Anda memiliki kueri yang lebih kompleks. Karena orang belajar pada kueri dasar, saya cenderung lebih suka orang belajar menggunakan sintaks bergabung sebelum mereka membutuhkannya dalam kueri yang kompleks.
Dan lagi saya tidak tahu Oracle secara khusus, tapi saya tahu versi SQL Server dari gaya lama bergabung kiri cacat bahkan dalam SQL Server 2000 dan memberikan hasil yang tidak konsisten (kadang-kadang bergabung kiri kadang-kadang bergabung silang), jadi seharusnya tidak pernah bekas. Semoga Oracle tidak mengalami masalah yang sama, tetapi tentu saja bergabung kiri dan kanan bisa lebih sulit untuk diekspresikan dengan benar dalam sintaks lama.
Ditambah lagi pengalaman saya (dan tentu saja ini hanya pendapat pribadi, Anda mungkin memiliki pengalaman berbeda) bahwa pengembang yang menggunakan standar ANSII bergabung cenderung memiliki pemahaman yang lebih baik tentang apa itu bergabung dan apa artinya dalam hal mendapatkan data dari database. Saya percaya bahwa karena sebagian besar orang dengan pemahaman basis data yang baik cenderung menulis pertanyaan yang lebih kompleks dan bagi saya tampaknya lebih mudah untuk mempertahankan menggunakan Standar ANSII daripada gaya lama.
sumber
[Untuk poin bonus ...]
Menggunakan sintaks GABUNG memungkinkan Anda untuk lebih mudah mengomentari bergabung karena semuanya termasuk dalam satu baris. Ini bisa bermanfaat jika Anda men-debug permintaan yang kompleks
Seperti orang lain katakan, mereka secara fungsional sama, namun GABUNGAN lebih jelas dari pernyataan niat. Oleh karena itu dapat membantu optimizer kueri baik dalam versi oracle saat ini dalam kasus-kasus tertentu (saya tidak tahu jika ya), itu dapat membantu optimizer permintaan dalam versi Oracle masa depan (tidak ada yang punya ide), atau dapat membantu jika Anda mengubah pemasok basis data.
sumber
Mereka identik secara logis, tetapi dalam versi Oracle sebelumnya yang mengadopsi sintaks ANSI sering ada bug dengan itu dalam kasus yang lebih kompleks, sehingga Anda kadang-kadang akan menghadapi perlawanan dari pengembang Oracle saat menggunakannya.
sumber
Kinerja harus identik, tetapi saya akan menyarankan menggunakan versi join karena kejelasan yang lebih baik ketika datang ke gabungan luar.
Juga produk kartesius yang tidak disengaja dapat dihindari menggunakan versi gabungan.
Efek ketiga adalah SQL yang lebih mudah dibaca dengan kondisi WHERE yang lebih sederhana.
sumber
Jangan lupa bahwa di Oracle, asalkan atribut kunci gabungan dinamai sama di kedua tabel, Anda juga dapat menulis ini sebagai:
Ini juga memiliki rencana permintaan yang sama, tentu saja.
sumber
Dalam skenario di mana tabel berada dalam bentuk normal ke-3, gabungan antara tabel tidak boleh berubah. Yaitu bergabung dengan PELANGGAN dan PEMBAYARAN harus selalu tetap sama.
Namun, kita harus membedakan gabungan dari filter . Bergabung adalah tentang hubungan dan filter adalah tentang mempartisi keseluruhan.
Beberapa penulis, mengacu pada standar (yaitu Jim Melton; Alan R. Simon (1993). Memahami SQL Baru: Panduan Lengkap. Morgan Kaufmann. Hlm. 11-12. ISBN 978-1-55860-245-8.) , menulis tentang manfaat untuk mengadopsi sintaks GABUNG atas tabel yang dipisahkan koma dalam klausa FROM.
Saya sepenuhnya setuju dengan sudut pandang ini.
Ada beberapa cara untuk menulis SQL dan mencapai hasil yang sama tetapi bagi banyak dari mereka yang melakukan kerja tim, keterbacaan kode sumber merupakan aspek penting, dan tentu saja terpisah bagaimana tabel saling berhubungan dari filter tertentu adalah lompatan besar dalam arti memperjelas sumber kode.
sumber
Di PostgreSQL, sama sekali tidak ada perbedaan - keduanya sama dengan rencana kueri yang sama. Saya 99% yakin itu juga berlaku untuk Oracle.
sumber
Keduanya sama-sama bagian dalam yang melakukan hal yang sama, satu hanya menggunakan sintaks ANSI yang lebih baru.
sumber
Secara fungsional mereka sama seperti yang telah dikatakan. Saya setuju bahwa melakukan join lebih baik untuk menggambarkan apa yang ingin Anda lakukan. Banyak kali saya berpikir saya tahu bagaimana saya ingin menanyakan sesuatu sampai saya mulai melakukan penggabungan dan menyadari bahwa saya ingin melakukan permintaan yang berbeda dari yang asli di kepala saya.
sumber
Memang benar bahwa, secara fungsional, kedua query harus diproses dengan cara yang sama. Namun, pengalaman telah menunjukkan bahwa jika Anda memilih dari tampilan yang menggunakan sintaks bergabung baru, penting untuk membuat struktur kueri Anda menggunakannya juga. Pengoptimal Oracle dapat menjadi bingung jika tampilan menggunakan pernyataan "bergabung", tetapi kueri yang mengakses tampilan menggunakan metode tradisional untuk bergabung dalam klausa "di mana".
sumber
Meskipun identitas dua pertanyaan tampak jelas kadang-kadang beberapa hal aneh terjadi. Saya telah datang dengan pertanyaan yang memiliki rencana pelaksanaan yang berbeda ketika memindahkan predikat bergabung dari BERGABUNG ke WHERE di Oracle 10g (untuk rencana WHERE lebih baik), tetapi saya tidak dapat mereproduksi masalah ini dalam tabel dan data yang disederhanakan. Saya pikir itu tergantung pada data dan statistik saya. Pengoptimal adalah modul yang cukup kompleks dan terkadang berperilaku ajaib.
Itulah sebabnya kami tidak dapat menjawab pertanyaan ini secara umum karena ini tergantung pada DB internal. Tetapi kita harus tahu bahwa jawabannya harus ' tidak ada perbedaan '.
sumber
Saya mengalami teka-teki ini hari ini ketika memeriksa salah satu waktu sp kami dalam produksi, mengubah sambungan dalam pada tabel yang dibangun dari umpan xml menjadi klausa 'di mana' sebagai gantinya .... rata-rata waktu eksekutif sekarang adalah 80m lebih dari 1000 eksekusi, sedangkan sebelum rata-rata eksekutif adalah 2,2 detik ... perbedaan utama dalam rencana eksekusi adalah hilangnya pencarian kunci ... Pesan yang Anda tidak akan tahu sampai Anda diuji menggunakan kedua metode.
Bersulang.
sumber
Mereka berdua bergabung dan di mana melakukan hal yang sama.
Lihat di pertanyaan MySQL, mengapa menggunakan gabung bukan di mana?
sumber
Seperti yang dikatakan kiewik, rencana pelaksanaannya sama.
Pernyataan JOIN hanya lebih mudah dibaca, membuatnya lebih mudah untuk tidak melupakan kondisi ON dan mendapatkan produk kartesius. Kesalahan ini bisa sangat sulit dideteksi dalam kueri panjang menggunakan beberapa gabungan tipe: SELECT * FROM t1, t2 WHERE t1.id = t2.some_field.
Jika Anda lupa hanya satu syarat bergabung, Anda mendapatkan waktu yang sangat lama untuk mengeksekusi kueri yang mengembalikan terlalu banyak rekaman ... benar-benar terlalu banyak. Beberapa orang menggunakan DISTINCT untuk menambal kueri, tetapi masih sangat lama untuk dieksekusi.
Itu sebabnya, menggunakan pernyataan GABUNG tentu saja merupakan praktik terbaik: pemeliharaan yang lebih baik, dan keterbacaan yang lebih baik.
Lebih jauh lagi, jika saya ingat dengan baik, GABUNG dioptimalkan menyangkut penggunaan memori.
sumber
Saya punya tambahan untuk jawaban yang bagus itu :
Itulah yang didefinisikan sebagai SQL92 dan SQL89 masing-masing, tidak ada perbedaan kinerja di antara mereka meskipun Anda dapat menghilangkan kata INNER (menggunakan JOIN saja sudah cukup jelas dan dalam kueri paling sederhana Anda menyimpan 5 stroke keyboard sekarang bayangkan berapa banyak stroke yang ada di besar yang).
sumber