मैं UNPIVOT को UNION ALL में तब्दील होने से कैसे रोक सकता हूं?


13

मेरे पास कुछ जटिल ओरेकल क्वेरी है जिसे पूरा होने में लगभग आधे घंटे का समय लग रहा है। अगर मैं क्वेरी का धीमा हिस्सा लेता हूं और इसे अलग से चलाता हूं तो यह कुछ सेकंड में खत्म हो जाता है। यहाँ अलग क्वेरी के लिए SQL मॉनिटर रिपोर्ट का एक स्क्रीनशॉट है:

ठीक है योजना

यहाँ पूर्ण तर्क के भाग के रूप में एक ही तर्क दिया गया है:

बुरी योजना

रंग दोनों स्क्रीनशॉट में समान तालिकाओं के अनुरूप हैं। धीमी क्वेरी के लिए, ओरेकल MERGE JOINदो तालिकाओं के बीच कर रहा है जिसमें समानता की स्थिति नहीं है JOIN। उसी के परिणामस्वरूप, लगभग 150 मिलियन मध्यवर्ती पंक्तियों को अनावश्यक रूप से संसाधित किया जाता है।

मैं क्वेरी संकेत या पुनर्लेखन के साथ इस समस्या को हल करने में सक्षम हूं, लेकिन मैं इसके मूल कारण के रूप में समझना चाहता हूं ताकि मैं भविष्य में इस समस्या से बच सकूं और संभवतः Oracle को बग रिपोर्ट प्रस्तुत कर सकूं। हर बार जब मुझे खराब योजना मिलती UNPIVOTहै तो क्वेरी टेक्स्ट को UNION ALLयोजना में बदल दिया जाता है । आगे की जांच के लिए मैं उस क्वेरी परिवर्तन को होने से रोकना चाहूंगा। मैं इस परिवर्तन के लिए एक नाम खोजने में असमर्थ रहा हूं। मैं एक क्वेरी संकेत या अंडरस्कोर पैरामीटर को खोजने में सक्षम नहीं हूं जो इसे रोक देगा। मैं एक विकास सर्वर पर परीक्षण कर रहा हूँ ताकि कुछ भी हो।

वहाँ कुछ भी है कि मैं की क्वेरी परिवर्तन को रोकने के लिए कुछ कर सकते हैं UNPIVOTकरने के लिए UNION ALL? मैं Oracle 12.1.0.2 पर हूं।

मैं आईपी कारणों के लिए क्वेरी, तालिका नाम या डेटा साझा करने में सक्षम नहीं हूं। मैं एक साधारण प्रजनन के साथ आने में सक्षम नहीं था। इसके साथ ही कहा, यह मेरे लिए अस्पष्ट है कि प्रश्न का उत्तर देने के लिए उस जानकारी की आवश्यकता क्यों है। यहाँ UNP के रूप में कार्यान्वित समान क्वेरी के साथ UNPIVOT क्वेरी का एक उदाहरण दिया गया है।


1
आपके उदाहरण में सभी मौजूद हैं इसलिए यह दिखाता है। मैंने अपनी खुद की क्वेरी चलाई जो कि सभी में एक संघ नहीं है और समझाती है कि योजना सभी को एक संघ नहीं दिखाती है। तो, शायद यह आपकी क्वेरी है न कि बिना धुरी के संचालन के कारण जो यहां समस्या पैदा कर रहा है?
राज

@ राज समस्या को और कम करने के लिए क्वेरी पाठ को बदले बिना उस परिवर्तन को अक्षम करने का बिंदु है।
जो ओबिश

3
मैं कई वर्षों से Oracle के साथ काम कर रहा हूं, लेकिन कभी-कभी मुझे आपके कॉलम / तालिकाओं के साथ क्वेरी या कम से कम संगत छद्म क्वेरी देखने की आवश्यकता होती है। जिसके बिना मैं अनुमान लगा सकता हूं लेकिन यह न तो आपके लिए उपयोगी है और न ही मेरे लिए।
राज

जवाबों:


1

निम्नलिखित ओरेकल ऑप्टिमाइज़र संकेत आज़माएं:

NO_EXPAND

यह संकेत OR- विस्तार को अक्षम करता है। OR- विस्तार whereक्लॉज़ में संयुक्त OR-conditions या IN-सूचियों को एक यौगिक क्वेरी में रूपांतरित करता है union all

हमारे पास आपकी एसक्यूएल नहीं है इसलिए यह एक अनुमान है लेकिन एक व्यवहार्य विकल्प लगता है।

दूसरे विकल्प के रूप में, चूंकि आप एक विकास के माहौल में हैं, आप Oracle आशावादी संकेत की कोशिश कर सकते हैं:

NO_QUERY_TRANSFORMATION

लेकिन यह संकेत उन सभी क्वेरी परिवर्तनों को निष्क्रिय कर देता है, जो ऑप्टिमाइज़र उन परिवर्तनों के अलावा अन्य कार्य कर सकता है जो ऑप्टिमाइज़र हमेशा लागू कर सकता है।


या UNPIVOT जैसी बात नहीं है। क्या आप एक सरल उदाहरण प्रस्तुत कर सकते हैं जो NO_EXPAND संकेत को UNPIVOT के लिए काम कर रहा है? मैंने यह कोशिश की है और यह मेरे काम नहीं आया।
जोब जूल

@JoeObbish - क्या आप UNPiVOT के साथ अपने जटिल SQL का स्केल-डाउन संस्करण प्रदान कर सकते हैं, कृपया? अगर मैं कर
सकूं

1
@JoeObbish - किसी अन्य सुझाव के साथ अद्यतन उत्तर। उम्मीद है की यह मदद करेगा।
कथा .५२१५०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.