Tamamlamak için yaklaşık yarım saat süren biraz karmaşık bir Oracle sorgusu var. Sorgunun yavaş kısmını alıp ayrı çalıştırırsam birkaç saniye içinde biter. İzole sorgu için SQL Monitor raporunun ekran görüntüsü:
Tam sorgunun bir parçası olarak çalıştırıldığında aynı mantık:
Renkler her iki ekran görüntüsünde de aynı tablolara karşılık gelir. Yavaş sorgu için, Oracle MERGE JOIN
eşitlik koşulu olmayan iki tablo arasında bir yapıyor JOIN
. Bunun bir sonucu olarak, yaklaşık 150 milyon ara sıra gereksiz yere işlenir.
Sorgu ipuçları veya yeniden yazma ile bu soruna geçici bir çözüm bulmak mümkün, ama ben gelecekte bu sorunu önlemek ve muhtemelen bir hata raporu Oracle için gönderebilirsiniz böylece ben mümkün olduğunca çok kök neden anlamak istiyorum. Her kötü plan olsun UNPIVOT
sorgu metin UNION ALL
içinde bir plana dönüştürülür . Daha fazla araştırmak için bu sorgu dönüşümünün gerçekleşmesini önlemek istiyorum. Bu dönüşüm için bir isim bulamadım. Ben de bunu engelleyecek bir sorgu ipucu veya alt çizgi parametresi bulmak mümkün olmamıştır. Bir geliştirme sunucusunda test ediyorum, böylece her şey gidiyor.
Ben sorgu dönüşümü önlemek için yapabileceği orada birşey var mı UNPIVOT
hiç UNION ALL
? Oracle 12.1.0.2 kullanıyorum.
IP nedenleriyle sorguyu, tablo adlarını veya verileri paylaşamıyorum. Basit bir reprodüksiyon bulamadım. Bununla birlikte, soruyu cevaplamak için bu bilgilerin neden gerekli olduğu bana açık değil. İşte BİRLİĞİ ALL olarak uygulanır, aynı sorgu boyunca UNPIVOT sorgusuna bir örnektir.