UNPIVOT'un UNION ALL'a dönüştürülmesini nasıl önleyebilirim?


13

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ü:

tamam plan

Tam sorgunun bir parçası olarak çalıştırıldığında aynı mantık:

kötü plan

Renkler her iki ekran görüntüsünde de aynı tablolara karşılık gelir. Yavaş sorgu için, Oracle MERGE JOINeş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 UNPIVOTsorgu metin UNION ALLiç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ı UNPIVOThiç 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.


1
Bu yüzden örnek birliğinizde hepsi var. Ben sendika hepsi olmayan kendi sorgu çalıştırdı ve planı bir sendika tüm göstermez açıklamak. Yani, belki sorgunuz ve soruna neden olan unpivot işlemi değil?
Raj

@Raj Mesele, sorunu daha da daraltmak için sorgu metnini değiştirmeden bu dönüşümü devre dışı bırakmaktır.
Joe Obbish

3
Yıllardır Oracle ile çalışıyorum, ancak bazen sütunları / tabloları değiştirildi sorgu veya en azından uyumlu sahte sorgu görmeniz gerekir. ki bunlar olmadan tahmin etmeye devam edebilirim ama bu ne sizin için ne de benim için yararlı değildir.
Raj

Yanıtlar:


1

Aşağıdaki Oracle optimizer ipucunu deneyin:

NO_EXPAND

Bu ipucu VEYA genişletmeyi devre dışı bırakır. OR-genişletmesi, whereyan tümcede bulunan OR-koşullarını veya IN-listelerini, ile bileşik sorguya dönüştürür union all.

SQL'iniz yok, bu yüzden bu bir tahmin ama geçerli bir seçenek gibi görünüyor.

İkinci bir seçenek olarak, bir geliştirme ortamında olduğunuz için Oracle optimizer ipucunu deneyebilirsiniz:

NO_QUERY_TRANSFORMATION

ama bu ipucu devre dışı bırakan tüm iyileştirici sorgu dönüşümleri yapabilirsiniz iyileştirici olduğu dönüşümlerin dışında gerçekleştirmek her zaman uygulayabilirsiniz.


VEYA UNPIVOT ile aynı şey değildir. UNPIVOT için çalışan NO_EXPAND ipucunu gösteren basit bir örnek verebilir misiniz? Bunu denedim ve benim için işe yaramadı.
Joe Obbish

@JoeObbish - UNPiVOT ile karmaşık SQL'inizin ölçeklendirilmiş bir sürümünü sağlayabilir misiniz? Yapabilirsem sana yardım etmek istiyorum ...
tale852150

1
@JoeObbish - cevap başka bir öneri ile güncellendi. Bu yardımcı olur umarım.
tale852150
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.