Erwin: Sert bir düzene neden olan USING'in, en iyi planların göz ardı edileceği birçok yeni durum yaratabileceği fikrine katılıyorum. Geçenlerde sorgusunda böyle bir şey olan birine yardım ettim:
LEFT JOIN (
a
JOIN b ON a.id = b.a_id
JOIN c ON b.c_id = c.id
) ON a.id = something.a_id
LEFT JOIN (
table1 t1
JOIN table2 t2 ON t1.some_field = t2.other_field
JOIN talbe3 t3 ON t2.yafield = t3.something_else
) ON ....
repeat a few more times
Bu durumda, bu birleştirme bloklarının en kötüsü, yaklaşık 200k satır boyunca iç içe geçen bir halkanın birleşmesine neden oldu (yaklaşık 20k kez) ve tuşlar indekslere itilemediğinden, sıralı bir taramaydı. Bu, genel sorgunun basamaklı plan değişiklikleri nedeniyle çalışması yaklaşık 3 saat sürdüğü anlamına geliyordu. Sol birleştirmeyi dağıtarak, tuşlar aşağı itilebilir ve sorgu birkaç saniye içinde çalıştırılabilir. Elbette bu tam olarak eşdeğer değildir, bu nedenle planlamacının onlara eşdeğer olarak muamele edememesinin nedeni, bu planın bir karma birleşimi olarak ortaya çıkması ve sonra acılı bir şekilde yavaş olan iç içe bir döngü yapmasıdır.
Birleşmeleri kesin bir düzende katı bir şekilde geçmeye zorladığınız zaman, anahtar filtre bilgilerinin henüz planın uygulanmasında bulunamadığı durumları ve daha sonra hızlı bir indeks taraması / hash birleştirmesinde daha sonra ne yapılabileceğini ortaya koyarsınız. Yuvalanmış bir döngü / sıralı taramada çok daha yavaş yapılması gerekebilir ve bu yüzden yukarıdaki parça hemen eşdeğer olmasa da aynı sorunu gösterir.
USING
biraz daha hızlı - sonuç matrisinde daha az bir sütunla sonuçlandığı için biraz daha hızlı . Bulgularınız 2005 ve 2008 yıllarına kadar uzanıyor. Şimdilik herhangi bir sorunun çözüldüğünü varsayıyorum. Ancak , olası bir sınırlama görebiliyorum: Ortaya çıkan birleştirme kolonu bir ortak ürün olduğu için sırasıyla birleştirme işleminin uygulanmasıUSING
gerekebilir . Böylece JOIN'lerin yeniden sıralanmasında potansiyel olarak sınırlayıcı seçenekler.