2009-09-23 14 views
9

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

नीचे कार्य योजना लागू की विधेय जानकारी अनुभाग के उदाहरण में:

10 - access("DOMAIN_CODE"='BLCOLLSTS' AND "CURRENT_VERSION_IND"='Y') 
    filter("CURRENT_VERSION_IND"='Y') 

क्यों "CURRENT_VERSION_IND" दोनों प्रवेश और फिल्टर वर्गों में दोहराया है?

इसी ऑपरेशन इंडेक्स पर इंडेक्स रेंज स्कैन है, जिसे फ़ील्ड (DOMAIN_CODE, CODE_VALUE, CURRENT_VERSION_IND, DECODE_DISPLAY) पर परिभाषित किया गया है।

मेरा अनुमान है कि CURRENT_VERSION_IND इंडेक्स में दूसरा कॉलम नहीं है, ओरेकल एक्सेस स्टेज के दौरान इसका उपयोग नहीं कर सकता है। इसलिए, यह DOMAIN_CODE कॉलम द्वारा अनुक्रमणिका तक पहुंचता है, सभी ब्लॉक लाता है, और फिर उन्हें CURRENT_VERSION_IND द्वारा फ़िल्टर करता है। क्या मैं सही हू?

उत्तर

6

नहीं, इस उदाहरण में पहुंच का अनुमान इंगित करता है कि सूचकांक DOMAIN_CODE और CURRENT_VERSION_IND दोनों से गुजर रहा है।

मैं फिल्टर अनुमान के बारे में चिंता नहीं करता जो कि अनावश्यक प्रतीत होता है - ऐसा लगता है कि यह समझाया गया योजना है, शायद इस तथ्य के साथ कुछ करना है कि इसे इंडेक्स पर स्किप-स्कैन करना है (यह पहले कॉलम पर एक रेंज स्कैन करता है, फिर CODE_VALUE पर स्कैन स्कैन करता है, किसी भी मिलान CURRENT_VERSION_IND एस के लिए खोज करता है)।

चाहे आपको इंडेक्स को संशोधित करने या अन्य इंडेक्स बनाने की आवश्यकता है, पूरी तरह से एक और मामला है।

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

+0

यदि किसी तालिका में 1, 2 और 3 कॉलम पर एक इंडेक्स परिभाषित किया गया है, तो क्या ओरेकल 10 इंडेक्स का उपयोग करने में सक्षम होगा यदि WHERE क्लॉज में पहले और तीसरे कॉलम पर भविष्यवाणी की जाती है? दूसरे और तीसरे पर? मैंने सोचा कि जवाब नहीं था। इसके अलावा, वास्तव में एक्सेस और फ़िल्टर के बीच अंतर क्या है? –

+2

संस्करण 9i से आगे (जब से उन्होंने स्कैन स्कैन इंडेक्स एक्सेस विधि पेश की थी) ओरेकल इंडेक्स का उपयोग कर सकता है चाहे आप कोल्स 1, 2, 3 या उनमें से किसी भी संयोजन को एक्सेस कर सकें। –

+1

"एक्सेस" भविष्यवाणी करता है जो इंडेक्स को स्कैन करने के लिए उपयोग किए जाते हैं - इन भविष्यवाणियों का उपयोग इंडेक्स से पुनर्प्राप्त करने के लिए कौन सी शाखा और पत्ती ब्लॉक चुनने के लिए किया जाता है, और वे क्वेरी के प्रदर्शन के लिए अधिक महत्वपूर्ण हैं। "फ़िल्टर" भविष्यवाणी करता है जो इंडेक्स से लौटाई गई पंक्तियों पर लागू होते हैं; वे निर्धारित करते हैं कि अंततः क्वेरी निष्पादन योजना में कौन सी पंक्तियां अगले चरण तक भेजी जाती हैं। योजना तालिका के ACCESS_PREDICATES और FILTER_PREDICATES के लिए दस्तावेज़ देखें: http://download.oracle.com/docs/cd/E11882_01/server.112/e10821/ex_plan.htm#PFGRF94708 –

2

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

हालांकि, अगर इस मामले सूचकांक के दूसरे स्तंभ के रूप में CURRENT_VERSION_IND जोड़ने में काफी पर प्रदर्शन में सुधार अक्सर क्वेरी चला और अन्य प्रश्नों के प्रदर्शन को नुकसान नहीं पहुंचाता, तो यह ऐसा करने के लिए बनाना उचित है।

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