2009-01-07 15 views
15

मैं क्वेरी प्रदर्शन को अनुकूलित करने की कोशिश कर रहा हूं और ऑप्टिमाइज़र संकेतों का उपयोग करके इसका सहारा लेना पड़ा है। लेकिन मैंने कभी नहीं सीखा है कि क्या अनुकूलक एक समय में एक से अधिक संकेतों का उपयोग करेगा।क्या ओरेकल ऑप्टिमाइज़र एक ही चयन में एकाधिक संकेतों का उपयोग करेगा?

उदा।

SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/ 
     /*+ LEADING(i vol) */ 
     /*+ ALL_ROWS */ 
     i.id_number, 
     ... 
    FROM i_table i 
    JOIN vol_table vol on vol.id_number = i.id_number 
    JOIN to_a_bunch_of_other_tables... 
WHERE i.solicitor_id = '123' 
    AND vol.solicitable_ind = 1; 

व्याख्या योजना एक ही लागत दिखाती है, लेकिन मुझे पता है कि यह सिर्फ एक अनुमान है।

कृपया मान लें कि सभी तालिका और अनुक्रमणिका आंकड़ों की गणना की गई है। एफवाईआई, इंडेक्स dcf_vol_prospect_ids_idx i.solicitor_id कॉलम पर है।

धन्यवाद,

स्टू

उत्तर

19

के रूप में अद्भुत ओरेकल प्रलेखन (http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm) से इस उदाहरण में दिखाया गया है, एक भी टिप्पणी ब्लॉक में सभी संकेत निर्दिष्ट करने का प्रयास।

16.2.1 संकेत

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

उदाहरण 16-1 में, अग्रणी संकेत का उपयोग करने के लिए सटीक जॉइन ऑर्डर निर्दिष्ट करता है; पर उपयोग करने के लिए शामिल विधियों को अलग-अलग टेबल निर्दिष्ट भी हैं।

उदाहरण 16-1 निर्दिष्ट संकेत

SELECT /*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk) 
      USE_MERGE(j) FULL(j) */ 
    e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal 
FROM employees e1, employees e2, job_history j 
WHERE e1.employee_id = e2.manager_id 
    AND e1.employee_id = j.employee_id 
    AND e1.hire_date = j.start_date 
GROUP BY e1.first_name, e1.last_name, j.job_id ORDER BY total_sal; 
+0

यदि कोई परवाह करता है, तो मैंने कोशिश की और स्पष्टीकरण योजना ने पहले की तरह ही लागत दी। कौन जानता है कि सीबीओ वास्तव में इसका इस्तेमाल करेगा! : -/ –

+0

डेव, मैंने कुछ अध्याय आरटीएफएम किया है, लेकिन उस महान उदाहरण पर कभी ठोकर नहीं लगा। गूंगा पोस्ट के लिए खेद है; मैं वास्तव में ऐसा करने की कोशिश नहीं करता!: -/ धन्यवाद, स्टू –

2

वास्तव में का एक पूरा सेट, जोनाथन लुईस, लागत के आधार पर ओरेकल बुनियादी बातों के लेखक की सिफारिश यह है कि अगर सीबीओ सही ढूँढने में विफल रहता है योजना, आपको सीबीओ और "परत-इन" संकेतों का काम लेने की आवश्यकता है - क्वेरी में प्रति तालिका के दो संकेतों का औसत।

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

+0

> सीबीओ गलत है कोई एक सुंदर, अगर बड़ा की तरह लगता है कि? :-) हालांकि दिलचस्प बिंदु। टॉम क्यटे के बारे में मैंने जो पढ़ा है, उससे वह संकेत देता है कि आप संकेतों का उपयोग करने से पहले सबकुछ संभव कर सकें। –

+1

पूरी तरह से सहमत हैं। लेकिन सीबीओ गलत हो सकता है और गलत होगा। कोई कोड नहीं है कि जटिल कभी भी सही होने की उम्मीद कर सकता है। मैं एक टीके भक्त हूं और वह सही है। उल्लेख नहीं है कि 9 0% प्रोग्रामर और डीबीए नहीं जानते हैं कि सीबीओ वास्तव में गलत कब है और यह सिर्फ झूठ बोला जा रहा है। –