2008-10-24 9 views
17

मुझे काम पर कुछ एसक्यूएल प्रश्नों को अनुकूलित करने के लिए काम सौंपा गया है। समस्या क्षेत्रों की पहचान करने के लिए मुझे समझाया गया सब कुछ समझाया गया है। समस्या यह है कि मुझे यह नहीं पता कि योजना क्या समझाती है मुझे बता रही है। आपको लागत, कार्डिनालिटी और बाइट मिलते हैं।प्रश्नों को अनुकूलित करने के लिए व्याख्या योजना का उपयोग कैसे करें?

यह क्या इंगित करता है, और मुझे इसे गाइड के रूप में कैसे उपयोग करना चाहिए। कम संख्या बेहतर हैं? उच्च बेहतर? कोई भी इनपुट बहुत प्रंशसनीय होगा।

या यदि आपके पास कोई प्रश्न अनुकूलित करने के बारे में बेहतर तरीका है, तो मुझे रूचि होगी।

उत्तर

8

आप जो भी कर रहे हैं उसके आधार पर आप उससे अधिक प्राप्त करते हैं। यह explain plan पृष्ठ देखें। मैं यहां थोड़ा सा मान रहा हूं कि आप ओरेकल का उपयोग कर रहे हैं और योजना आउटपुट प्रदर्शित करने के लिए स्क्रिप्ट को चलाने के बारे में जानते हैं। शुरू करने के लिए और अधिक महत्वपूर्ण हो सकता है कि किसी विशेष इंडेक्स के उपयोग के लिए बाईं तरफ देख रहे हों या नहीं और यह सूचकांक कैसे उपयोग किया जा रहा है। आपको "(पूर्ण)", "(इंडेक्स रोविड द्वारा)" जैसी चीज़ें देखना चाहिए, आदि यदि आप जुड़ रहे हैं। लागत कम लागत के साथ देखने के लिए अगली बात होगी और आप देखेंगे कि यदि आप एक ऐसे इंडेक्स में शामिल हैं जो इंडेक्स का उपयोग नहीं कर रहा है तो आपको बहुत बड़ी लागत मिल सकती है। आप explain plan columns के बारे में विवरण भी पढ़ना चाहेंगे।

+0

मैं आपकी मदद करता हूं, और विशेष रूप से लिंक की सराहना करता हूं। यह अब से मेरे लिए शुरू हो रहा है। मदद के लिए एक बार फिर से धन्यवाद। –

+1

इंडेक्स का उपयोग न करने में शामिल हो सकता है बुरा हो सकता है, वे बिल्कुल सही हो सकते हैं।यह सब निर्भर करता है। मत करो, इंडेक्स के साथ हर पूर्ण टेबल स्कैन को खत्म करने की कोशिश मत करो। –

6

आपको लॉलीपॉप का अस्पष्ट अंत मिला।

अलगाव में, बिना किसी अतिरिक्त जानकारी और अनुभव के एक टन के, एक व्याख्या योजना को देखने के लिए और यह निर्धारित करने के लिए कि क्या (यदि कुछ भी) इष्टतम प्रदर्शन से कम हो रहा है, बिल्कुल कोई रास्ता नहीं है। यदि क्वेरी ट्यूनिंग को 10 चरणों की प्रक्रिया में कम किया जा सकता है तो यह स्वचालित प्रक्रिया द्वारा किया जाएगा। मैं उन सभी चीजों को सूचीबद्ध करने वाला था जो आपको समझने के लिए समझने की जरूरत है लेकिन यह एक बहुत लंबी सूची होगी।

एकमात्र छोटा सा जवाब जो मैं सोच सकता हूं ... योजना में कदमों की तलाश है जो आपके अनुमान लगाए जाने से अधिक बाइट्स के माध्यम से जा रहे हैं। फिर इस बारे में सोचें कि आप उस संख्या को कैसे कम कर सकते हैं ... किसी इंडेक्स या विभाजन के माध्यम से।

गंभीरता से, लागत पर जोनाथन के लुईस पुस्तक के आधार ओरेकल fundementals

मिल Oracle डाटाबेस वास्तुकला पर टॉम Kyte की पुस्तक जाओ और कुछ ही हफ्तों के लिए जंगल में एक केबिन किराया।

+0

मैंने यह महसूस करना शुरू कर दिया था कि यह उतना आसान नहीं था जितना कि मूल रूप से मुझे काम पर वर्णित किया गया था। पुस्तक सुझावों के लिए धन्यवाद, उन्हें पढ़ने के लिए पुस्तकों की मेरी सूची में जोड़ा जाएगा। –

+1

उन्हें कतार में न जोड़ें ... उन्हें शीर्ष पर ले जाएं और जो कुछ भी आप उन्हें पढ़ने के लिए कर सकते हैं। मैं पहले लुईस की किताब कहूंगा। यह पूरी तरह से एक व्याख्या योजना का मतलब है - हालांकि यह इस तरह से लिखा नहीं है। –

4

यह विशेषज्ञता का एक बड़ा क्षेत्र है (उर्फ एक काला कला)।

दृष्टिकोण मैं आम तौर पर ले रहा है:

  1. प्रश्न में SQL विवरण भागो,
  2. वास्तविक योजना (ऊपर देखो dbms_xplan) जाओ,
  3. पंक्तियों (प्रमुखता) बनाम की अनुमानित संख्या की तुलना करें पंक्तियों की वास्तविक संख्या। एक बड़ा अंतर एक समस्या को ठीक करने के लिए इंगित करता है (उदा। इंडेक्स, हिस्टोग्राम)
  4. विचार करें कि क्या आप प्रक्रिया के हिस्से को गति देने के लिए एक सूचकांक बना सकते हैं (आमतौर पर जहां आप सोचते हैं कि योजना पहले जाना चाहिए)। कुछ इंडेक्स आज़माएं।

आपको डेटाबेस से पूछे जाने वाले संदर्भ के संदर्भ में विभिन्न इंडेक्स के ओ() प्रभावों को समझने की आवश्यकता है। यह आपको बी-पेड़, हैश टेबल इत्यादि जैसे डेटा संरचनाओं को समझने में मदद करता है। फिर, एक ऐसी अनुक्रमणिका बनाएं जो काम कर सकती है और प्रक्रिया को दोहरा सकती है।

यदि ओरेकल आपके सूचकांक का उपयोग न करने का निर्णय लेता है, तो INDEX() संकेत लागू करें और नई योजना देखें। लागत उस योजना से अधिक होगी जो उसने चुनी थी - यही कारण है कि उसने आपकी अनुक्रमणिका नहीं ली।संकेतित योजना से कुछ अंतर्दृष्टि हो सकती है कि आपकी अनुक्रमणिका अच्छी क्यों नहीं है।

+0

ओरेकल एक इंडेक्स का उपयोग करने का चयन नहीं कर रहा है, पहली बार आपके स्पष्टीकरण तक, मुझे अब तक अजीब लग रहा था, और अब मुझे एहसास हुआ कि मैं कभी भी गहराई से महसूस कर रहा हूं। अगर वे केवल हमारे साथ काम करने के लिए एक अनुभवी डीबीए प्राप्त करेंगे, तो हम बेहतर होंगे। –

7

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

कुछ टिप्स का पालन करें:

सबसे पहले, जब कोई कार्य आप अनुकूलन करने के लिए, वे लगभग हमेशा अंतिम प्रदर्शन के बजाय स्वीकार्य प्रदर्शन के लिए देख रहे हैं। यदि आप किसी क्वेरी के चलने वाले समय को 3 मिनट से 3 सेकंड तक कम कर सकते हैं, तो इसे तब तक 2 सेकंड तक कम करने पर पसीना न पड़े जब तक आपसे पूछा नहीं जाता है।

दूसरा, यह सुनिश्चित करने के लिए एक त्वरित जांच करें कि आप जिन प्रश्नों को अनुकूलित कर रहे हैं वे तार्किक रूप से सही हैं। यह बेतुका लगता है, लेकिन मैं आपको धीमी गति से चलने वाली क्वेरी पर सलाह के लिए पूछे जाने वाले समय की संख्या नहीं बता सकता, केवल यह पता लगाने के लिए कि यह कभी-कभी गलत जवाब दे रहा था! और जैसा कि यह पता चला है, क्वेरी को डिबग करना अक्सर इसे गति देने के लिए बाहर निकला।

विशेष रूप से, व्याख्या योजना में "कार्टेशियन जॉइन" वाक्यांश की खोज करें। यदि आप इसे वहां देखते हैं, तो संभावनाएं बहुत अच्छी हैं कि आपको एक अनजान कार्टशियन शामिल हो गया है। एक अनजान कार्टेशियन जुड़ने के लिए सामान्य पैटर्न यह है कि फोरम क्लॉज को अल्पविराम से अलग टेबल सूचीबद्ध करता है, और जुड़ने की स्थिति WHERE खंड में होती है। सिवाय इसके कि इसमें शामिल होने वाली स्थितियों में से एक गायब है, ताकि ओरेकल के पास कार्टियरियन शामिल होने के अलावा कोई विकल्प न हो। बड़ी टेबल के साथ, यह एक प्रदर्शन आपदा है।

कार्टेशियन को समझाने की योजना में शामिल होना संभव है जहां क्वेरी तर्कसंगत रूप से सही है, लेकिन मैं इसे ओरेकल के पुराने संस्करणों से जोड़ता हूं।

भी अप्रयुक्त कंपाउंड इंडेक्स की तलाश करें। यदि कंपाउंड इंडेक्स का पहला कॉलम क्वेरी में उपयोग नहीं किया जाता है, तो ओरेकल इंडेक्स का उपयोग अक्षमता से कर सकता है, या बिल्कुल नहीं। मुझे एक उदाहरण देता हूँ:

क्वेरी था:

select * from customers  
where 
    State = @State 
    and ZipCode = @ZipCode 

(डीबीएमएस ओरेकल नहीं था, इसलिए वाक्य रचना अलग था, और मैं मूल वाक्य रचना भूल गए हैं)।

इंडेक्स पर एक त्वरित झलक ने उस क्रम में कॉलम (देश, राज्य, ज़िपकोड) के साथ ग्राहकों पर एक सूचकांक का खुलासा किया। मैं क्वेरी बदल

select * from customers 
    where Country = @Country 
     and State = @State 
     and ZipCode = @ZipCode 

को पढ़ने के लिए और अब यह, के बजाय लगभग 6 मिनट के बारे में 6 सेकंड में भाग गया क्योंकि अनुकूलक अच्छा लाभ के लिए सूचकांक का उपयोग करने में सक्षम था। मैंने आवेदन प्रोग्रामर से पूछा कि उन्होंने देश को मानदंडों से क्यों छोड़ा था, और यह उनका जवाब था: उन्हें पता था कि सभी पतेों में देश 'यूएसए' के ​​बराबर था, इसलिए उन्होंने सोचा कि वे उस मानदंड को छोड़कर क्वेरी को तेज कर सकते हैं!

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

जब आप इसे आउटमार्ट करने की कोशिश करने के बजाय इसके साथ सहयोग करना सीखते हैं तो आपको आमतौर पर अनुकूलक से बेहतर परिणाम मिलते हैं।

अनुकूलन पर गति के लिए अच्छी किस्मत आ रही है!

+0

सलाह के लिए धन्यवाद। मैं कुछ अन्य प्रश्नों में ऊपर वर्णित कार्टेशियन जॉइन मुद्दे में भी भाग गया था जिस पर काम कर रहा था और इससे समय में एक बड़ा अंतर आया और अब प्रश्न वास्तव में वापस लौटते हैं जो उन्हें माना जाता है। जाओ पता लगाओ। –

संबंधित मुद्दे