Ketika saya menulis permintaan seperti ini ...
select *
from table1 t1
join table2 t2
on t1.id = t2.id
Apakah pengoptimal SQL, tidak yakin apakah itu istilah yang benar, menerjemahkannya ke ...
select *
from table1 t1, table2 t2
where t1.id = t2.id
Pada dasarnya, apakah pernyataan Bergabung dalam SQL Server hanyalah cara yang lebih mudah untuk menulis sql? Atau apakah ini benar-benar digunakan pada saat run-time?
Sunting: Saya hampir selalu, dan hampir selalu, menggunakan sintaks Gabung. Saya hanya ingin tahu apa yang terjadi.
sql-server
t-sql
join
optimization
Tuan Ant
sumber
sumber
GROUP BY ALL
diGROUP BY ALL
yang sengaja digunakan? :-)Jawaban:
Itu runtuh ke hal yang sama secara internal. Yang pertama adalah yang harus selalu Anda tulis . Lebih penting lagi, mengapa itu penting? Mereka identik dalam hal rencana dan kinerja eksekusi (dengan asumsi Anda tidak mengacaukannya, yang lebih mudah dilakukan dengan sintaks gaya lama yang malas).
Inilah bukti menggunakan AdventureWorks bahwa tidak ada
CROSS JOIN
danfilter
terjadi.Bergabung secara eksplisit:
Bergabung secara implisit:
Lihat, bu! Rencana identik, hasil identik, tidak ada sambungan silang atau filter yang terlihat di mana pun.
(Untuk kejelasan, peringatan pada
SELECT
operator dalam kedua kasus adalah konversi tersirat yang mempengaruhi kardinalitas, tidak ada hubungannya dengan sambungan dalam kedua kasus tersebut.)sumber
Sebenarnya, ada perbedaan dalam input ke optimizer permintaan antara dua bentuk:
Seperti yang Anda lihat,
ON
predikat klausa terikat erat dengan join menggunakan sintaksis modern. Dengan sintaks yang lebih lama, ada gabungan silang logis diikuti oleh pilih relasional (filter baris).Pengoptimal kueri hampir selalu menciutkan pilihan relasional ke dalam gabungan selama optimisasi, yang berarti kedua formulir tersebut kemungkinan besar akan menghasilkan rencana kueri yang setara, tetapi tidak ada jaminan yang sebenarnya.
sumber
Untuk join dalam mereka dapat dipertukarkan, tetapi untuk Outer Joins mereka memiliki arti yang berbeda - ON cocok dan DI MANA adalah penyaringan sederhana. Jadi lebih baik untuk tetap berpadanan dengan sintaks GABUNG.
sumber
OK, saya penasaran jadi saya melakukan tes. Saya punya rencana eksekusi aktual untuk yang berikut.
dan
Saya membandingkan mereka objek demi objek dan mereka identik. Jadi setidaknya untuk contoh yang sangat sederhana, mereka keluar untuk hal yang sama. Saya juga memeriksa statistik IO dan waktu dan mereka cukup dekat untuk menjadi hal yang sama.
Yang sedang berkata, Anda harus menggunakan
JOIN
sintaksis karena lebih mudah dibaca dan Anda cenderung membuat kesalahan, terutama dalam pertanyaan yang rumit. Dan*=
/=*
sintaks untukOUTER
bergabung telah dihapus sebagai SQL-Server 2005.sumber