Saya telah mendengar informasi yang beragam tentang hal ini dan saya mengharapkan pendapat kanonik atau ahli.
Jika saya memiliki banyak LEFT OUTER JOIN
s, masing-masing bergantung pada yang terakhir, apakah lebih baik untuk membuat sarang?
Untuk contoh yang dibuat-buat, JOIN
to MyParent
tergantung pada JOIN
ke MyChild
:
http://sqlfiddle.com/#!3/31022/5
SELECT
{columns}
FROM
MyGrandChild AS gc
LEFT OUTER JOIN
MyChild AS c
ON c.[Id] = gc.[ParentId]
LEFT OUTER JOIN
MyParent AS p
ON p.[id] = c.[ParentId]
Dibandingkan dengan http://sqlfiddle.com/#!3/31022/7
SELECT
{columns}
FROM
MyGrandChild AS gc
LEFT OUTER JOIN
(
MyChild AS c
LEFT OUTER JOIN
MyParent AS p
ON p.[id] = c.[ParentId]
)
ON c.[Id] = gc.[ParentId]
Seperti yang ditunjukkan di atas ini menghasilkan rencana permintaan yang berbeda di SS2k8
sql-server-2008-r2
performance
join
Matius
sumber
sumber
JOIN
adalahINNER JOIN
ON ... ON
dua kali berturut-turut (tanda kurung atau tidak) sangat membingungkan.use plan
hint bekerja ketika tanam rencana permintaan kedua untuk pertama tetapi tidak sebaliknya.Jawaban:
Ini sama sekali bukan jawaban kanonik tapi saya perhatikan bahwa untuk rencana kueri nested loop yang ditunjukkan dalam SQL Fiddle dimungkinkan untuk menerapkan rencana dari Query 2 ke Query 1 dengan menggunakan
USE PLAN
petunjuk tetapi mencoba operasi sebaliknya gagal denganMenonaktifkan aturan transformasi pengoptimal
ReorderLOJN
mencegah petunjuk rencana sukses sebelumnya juga berhasil.Bereksperimen dengan jumlah yang lebih besar dari acara data yang SQL Server tentu mampu mengubah
(A LOJ B) LOJ C
keA LOJ (B LOJ C)
alami juga tapi aku tidak melihat bukti bahwa sebaliknya adalah benar.Kasus yang sangat dibuat-buat di mana kueri pertama berkinerja lebih baik daripada yang kedua
Yang memberi rencana
Bagi saya, Kueri 1 memiliki waktu yang telah berlalu 108 ms vs 1.163 ms untuk Kueri 2.
Pertanyaan 1
Pertanyaan 2
Jadi mungkin untuk sementara diasumsikan bahwa sintaks pertama ("tidak dicoba") berpotensi menguntungkan karena memungkinkan lebih banyak pesanan bergabung yang potensial untuk dipertimbangkan, tetapi saya belum melakukan pengujian yang cukup mendalam untuk memiliki banyak kepercayaan dalam hal ini sebagai aturan umum.
Sangat mungkin untuk memberikan contoh tandingan di mana Kueri 2 berkinerja lebih baik. Coba keduanya dan lihat rencana eksekusi.
sumber
tidak ada Jenis GABUNGAN yang disebut "Nested Join". itu adalah variasi lain dari penulisan yang GABUNG mungkin untuk tujuan kenyamanan mudah dibaca. Anda dapat melihatnya sebagai "Sub Pertanyaan" hanya untuk memahami tujuan.
jika Anda lebih peduli tentang keterbacaan kode maka menurut saya, itu adalah pilihan individu apa yang dapat mereka selesaikan.
Dan jika Anda khawatir dengan kinerja kueri, dan petunjuk "Force JOIN ORDER" tidak digunakan dalam kueri, maka tidak masalah jika kueri ditulis dengan "Nested Join" atau All "Outer Join". SQL server datang dengan urutan berdasarkan biaya bergabung dengan dua tabel dan / atau hasil. SQL Server BERGABUNG di antara dua set data sekaligus.
sebenarnya, bayangkan bahwa dengan cara kedua "bersarang bergabung" jika SQL server memutuskan untuk melakukan bagian kedua, "MyChild AS c LEFT OUTER BERGABUNG MyParent AS p ON p. [id] = c. [ParentId]" dan tabel tersebut terjadi untuk memiliki baris yang akan dibuang di BERGABUNG LEFT BERIKUTNYA. dalam hal ini SQL server telah menghabiskan sumber daya yang tidak perlu untuk melakukan OUTER GABUNG keduanya dan meneruskan hasilnya ke GABUNG berikutnya.
Anda juga dapat melihat pertanyaan serupa yang ditanyakan dan dijawab dengan tepat di sini. Memahami sintaks 'Nested join'
sumber
FORCE JOIN ORDER
petunjuk?