ग्यारह दिन पहले, मैंने ब्लॉग किया था कि कैसे अनुकूली गतिशील आँकड़े मेरे उत्पादन आरएसी डेटाबेस में संसाधनों का उपभोग कर रहे थे।
उस आग को बुझाने के बाद, मैं परीक्षण और अन्य गैर-उत्पादन डेटाबेस में हमारे क्यूए लोगों द्वारा रिपोर्ट किए जा रहे कुछ खराब प्रदर्शन वाले प्रश्नों की जांच कर रहा था। मैंने वही किया जो कोई भी अच्छा Oracle DBA करेगा। मैंने एक संग्रहीत प्रक्रिया कॉल एकत्र की जिसने समस्या को डुप्लिकेट किया। अपने सत्र में, मैंने एक SQL ट्रेस शुरू किया और संग्रहीत कार्यविधि को चलाया। इसे पूरा होने में 50 सेकंड का समय लगता था, जब मैं 11.2.0.4 से 12.1.0.2 में अपग्रेड होने से पहले 5 सेकंड या उससे कम समय लेता था। इस संग्रहीत कार्यविधि में कई SQL कथन शामिल हैं और एक SQL ट्रेस प्रारंभ करने के लिए एक तार्किक स्थान की तरह लग रहा था। मुझे यह जानने की जरूरत थी कि प्रक्रिया में कौन सा SQL कथन समस्या पैदा कर रहा था।
मैंने TKPROF के माध्यम से SQL ट्रेस फ़ाइल चलाई और परिणामों से हैरान था। संग्रहीत प्रक्रिया में SQL कथन बहुत तेज़ी से निष्पादित हो रहे थे। लेकिन मुझे निम्नलिखित के समान कई बयानों से बधाई दी गई:
SELECT /* DS_SVC */ /*+ dynamic_sampling(0) no_sql_tune no_monitoring optimizer_features_enable(default) no_parallel */ SUM(C1) FROM (SELECT /*+ qb_name("innerQuery") INDEX_FFS( "XXX" "INDEX_NAME") */ 1 AS C1 FROM "OWNER"."TABLE_NAME" SAMPLE BLOCK(71.048, 8) SEED(1) "XXX") innerQuery
यह काम पर गतिशील नमूनाकरण है। मेरी ट्रेस फ़ाइल में निष्पादित किए जा रहे सभी डायनामिक सैंपलिंग स्टेटमेंट को देखते हुए, मैं यह निर्धारित करने में सक्षम था कि ये कुल रनटाइम के 45 सेकंड के लिए जिम्मेदार हैं! ओह!
गतिशील नमूनाकरण मेरी मदद करने वाला है। कुछ नमूना आंकड़े प्राप्त करने में लगने वाला समय बेहतर आँकड़ों के साथ SQL कथन को क्रियान्वित करने से बचाए गए समय से बहुत कम माना जाता है। यदि ऐसा नहीं होता है, तो आपका SQL कथन प्रदर्शन प्रभावित हो सकता है, जैसा कि मेरा मामला था।
मैंने एक बात नोट की जो मुझे दिलचस्प लगी कि ये गतिशील नमूनाकरण प्रश्न प्रत्येक तालिका के लिए एक बार और इसके प्रत्येक अनुक्रमणिका के लिए एक बार निष्पादित किए गए थे। मेरी क्वेरी में शामिल एक टेबल में 7 इंडेक्स हैं, इसलिए उस एक टेबल के लिए, मेरे पास 8 डायनेमिक सैंपलिंग क्वेरीज़ थीं!
11 दिन पहले अपने ब्लॉग पोस्ट में, मैंने ऑप्टिमाइज़र_डायनामिक_सैंपलिंग पैरामीटर को 0 पर सेट किया था, जो इन प्रश्नों को निष्पादित होने से रोकता है। मैंने अभी तक उस बदलाव को अपने टेस्ट परिवेश में नहीं डाला था इसलिए मुझे ऐसा करना पड़ा। जैसे ही मैंने किया, क्वेरी प्रदर्शन सामान्य हो गया। मेरे डेटाबेस के लिए इस पैरामीटर का डिफ़ॉल्ट मान 2 है। आपका डिफ़ॉल्ट मान ऑप्टिमाइज़र_फीचर्स_इनेबल सेटिंग के मान के आधार पर भिन्न हो सकता है। इस ब्लॉग पोस्ट के अनुसार, 2 के मान का अर्थ है कि जब कम से कम एक तालिका में कोई आंकड़े नहीं होंगे तो गतिशील नमूनाकरण शुरू हो जाएगा। लेकिन सच कहूं, तो डायनेमिक सैंपलिंग से मुझे कोई फायदा नहीं हो रहा है और इससे मुझे ही नुकसान होता है। इसलिए मैं इसे अभी के लिए पूरी तरह से छोड़ दूंगा।