2010-08-11 6 views
5

यहां मेरी क्वेरी है:ओरेकल में इस प्रश्न का परिणाम मेर्ज जॉइन कार्टिसियन में क्यों होता है?

select count(*) 
from email_prod_junc j 
inner join trckd_prod t5 on j.trckd_prod_sk = t5.trckd_prod_sk 
inner join prod_brnd b on t5.prod_brnd_sk = b.prod_brnd_sk 
inner join email e on j.email_sk = e.email_sk 
inner join dm_geography_sales_pos_uniq u on (u.emp_sk = e.emp_sk and u.prod_brnd_sk = b.prod_brnd_sk) 

व्याख्या योजना कहती है:

कार्टेशियन DM_GEOGRAPHY_SALES_POS_UNIQ और EMAIL_PROD_JUNC के बीच जुड़ें।

मुझे समझ में नहीं आता है क्योंकि प्रत्येक तालिका के लिए एक शर्त स्थिति क्यों है।

+4

क्या मर्ज कार्टियरियन में वास्तव में प्रदर्शन समस्याओं का कारण बनती है या क्या आप इसे देखने की उम्मीद नहीं करते हैं? यदि आप जिन टेबलों में शामिल हो रहे हैं उनमें से एक पंक्तियों में शामिल होने के लिए कार्टसियन में शामिल हो सकते हैं। इसके अलावा ओरेकल संस्करण सहायक होगा क्योंकि रिलीज से रिलीज होने के लिए ऑप्टिमाइज़र बदल दिए गए हैं/बेहतर हैं। –

+0

हां, कार्ट में शामिल होने के लिए क्वेरी में एक मिनट का समय लगा। एक बार जब मैंने आदेश दिया गया संकेत जोड़ा, तो यह <1s में लौटा। यह ओरेकल 10 जी है। Trckd_Prod और Prod_Brnd छोटी टेबल हैं, अन्य 3 बहुत बड़े हैं। –

+0

@ मार्कशेरेटा - 10 जी ऑप्टिमाइज़र को फ्लैकी के रूप में जाना जाता है और संकेतों की आवश्यकता होती है जो ऑप्टिमाइज़र के बाद के संस्करणों की आवश्यकता नहीं होती है। 11.1 सुंदर ठोस - 11.2 बेहतर। मेरे पास 12 के साथ कोई व्यक्तिगत अनुभव नहीं है इसलिए यह नहीं कह सकता कि यह कैसा चल रहा है। –

उत्तर

5

मैं आदेश दिया संकेत जोड़कर इस हल से भरा में शामिल होने के समाप्त:

select /*+ ordered */ 

मैं तुम्हें क्रम में तालिकाएं निर्दिष्ट आप चाहते हैं उन्हें शामिल हो गए और इस संकेत का उपयोग करते हैं से here

जानकारी मिल गया, ओरेकल क्रम में शामिल होने के इष्टतम पता लगाने की कोशिश समय नहीं बिताएंगे, यह सिर्फ शामिल हो जाएगा उन्हें फोरम क्लॉज में आदेश दिया जाता है।

+0

क्या यह परिवर्तन प्रदर्शन को प्रभावित करता है? – Allan

+0

हां, प्रदर्शन> 1minute से <1s तक चला गया। –

0

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

: मैं Oracle की व्याख्या कर योजना के साथ वास्तव में परिचित नहीं हूँ, इसलिए मैं नहीं कह सकता कि अधिकार के साथ

संपादित

आप इस परिकल्पना का परीक्षण करना चाहता था, तो आप करने के लिए क्वेरी को बदलने की कोशिश कर सकते

inner join dm_geography_sales_pos_uniq u on u.emp_sk = e.emp_sk 
where u.prod_brnd_sk = b.prod_brnd_sk 

और देखते हैं कि अगर योजना

+1

धन्यवाद RMorrisey, लेकिन यह काम नहीं किया, यह एक ही निष्पादन योजना में परिणाम। –

1

अपनी अनुक्रमणिका और पूर्ण योजना को जानने के बिना, यह कहना मुश्किल है कि यह वास्तव में क्यों हो रहा है। मेरा सबसे अच्छा अनुमान यह है कि EMAIL_PROD_JUNC और DM_GEOGRAPHY_SALES_POS_UNIQ अपेक्षाकृत छोटे हैं और TRCKD_PROD (trckd_prod_sk, prod_brnd_sk) पर एक अनुक्रमणिका है। यदि ऐसा है, तो ऑप्टिमाइज़र ने फैसला किया होगा कि दो छोटी टेबलों पर कार्टेसियन TRCKD_PROD को दो बार फ़िल्टर करने से कम महंगा है।

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