EXPLAIN PLAN का आउटपुट Oracle के क्वेरी ऑप्टिमाइज़र से डिबग आउटपुट है। COST, कॉस्ट-बेस्ड ऑप्टिमाइज़र (CBO) का अंतिम आउटपुट है, जिसका उद्देश्य यह चुनना है कि क्वेरी को चलाने के लिए कई अलग-अलग संभावित योजनाओं में से किसका उपयोग किया जाना चाहिए। CBO प्रत्येक योजना के लिए एक सापेक्ष लागत की गणना करता है, फिर न्यूनतम लागत वाली योजना को चुनता है।
(नोट:कुछ मामलों में सीबीओ के पास हर संभावित योजना का मूल्यांकन करने के लिए पर्याप्त समय नहीं होता है; इन मामलों में यह अभी तक मिली सबसे कम लागत वाली योजना को चुनता है)
सामान्य तौर पर, धीमी क्वेरी के लिए सबसे बड़े योगदानकर्ताओं में से एक क्वेरी की सेवा के लिए पढ़ी जाने वाली पंक्तियों की संख्या है (ब्लॉक, अधिक सटीक होने के लिए), इसलिए लागत आधारित होगी भाग में पंक्तियों की संख्या पर ऑप्टिमाइज़र अनुमानों को पढ़ने की आवश्यकता होगी।
उदाहरण के लिए, मान लें कि आपके पास निम्न क्वेरी है:
SELECT emp_id FROM employees WHERE months_of_service = 6;
(months_of_service
कॉलम पर एक NOT NULL बाधा है और उस पर एक सामान्य अनुक्रमणिका है।)
अनुकूलक यहाँ दो बुनियादी योजनाएँ चुन सकता है:
- योजना 1:"कर्मचारी" तालिका से सभी पंक्तियों को पढ़ें, प्रत्येक के लिए, जांचें कि क्या विधेय सत्य है (
months_of_service=6
)। - प्लान 2:वह इंडेक्स पढ़ें जहां
months_of_service=6
(यह ROWIDs के एक सेट में परिणत होता है), फिर लौटाए गए ROWID के आधार पर तालिका तक पहुंचें।
आइए कल्पना करें कि "कर्मचारी" तालिका में 1,000,000 (1 मिलियन) पंक्तियां हैं। आइए आगे कल्पना करें कि महीने_ऑफ_सर्विस के मान 1 से 12 तक हैं और किसी कारण से काफी समान रूप से वितरित किए गए हैं।
योजना 1 . की लागत , जिसमें एक पूर्ण स्कैन शामिल है, कर्मचारी तालिका में सभी पंक्तियों को पढ़ने की लागत होगी, जो लगभग 1,000,000 के बराबर है; लेकिन चूंकि ओरेकल अक्सर मल्टी-ब्लॉक रीड्स का उपयोग करके ब्लॉक को पढ़ने में सक्षम होगा, वास्तविक लागत कम होगी (आपके डेटाबेस की स्थापना के आधार पर) - उदा। आइए कल्पना करें कि मल्टी-ब्लॉक रीड काउंट 10 है - पूर्ण स्कैन की गणना की गई लागत 1,000,000 / 10 होगी; कुल लागत =100,000.
योजना 2 . की लागत , जिसमें INDEX RANGE SCAN और ROWID द्वारा एक टेबल लुकअप शामिल है, इंडेक्स को स्कैन करने की लागत, साथ ही ROWID द्वारा टेबल तक पहुँचने की लागत होगी। मैं यह नहीं बताऊंगा कि इंडेक्स रेंज स्कैन की लागत कैसे होती है, लेकिन आइए कल्पना करें कि इंडेक्स रेंज स्कैन की लागत प्रति पंक्ति 1 है; हम 12 मामलों में से 1 में एक मैच खोजने की उम्मीद करते हैं, इसलिए इंडेक्स स्कैन की लागत 1,000,000 / 12 =83,333 है; साथ ही तालिका तक पहुंचने की लागत (मान लें कि प्रति पहुंच 1 ब्लॉक पढ़ा जाता है, हम यहां बहु-ब्लॉक पढ़ने का उपयोग नहीं कर सकते हैं) =83,333; कुल लागत =166,666।
जैसा कि आप देख सकते हैं, योजना 1 (पूर्ण स्कैन) की लागत योजना 2 (सूचकांक स्कैन + पंक्तिबद्ध द्वारा पहुंच) की लागत से कम है - जिसका अर्थ है कि सीबीओ पूर्ण स्कैन का चयन करेगा।
अगर ऑप्टिमाइज़र द्वारा यहां की गई धारणाएं सही हैं, तो वास्तव में प्लान 1 बेहतर होगा और प्लान 2 की तुलना में बहुत अधिक कुशल होगा - जो इस मिथक को खारिज करता है कि पूर्ण स्कैन "हमेशा खराब" होते हैं।
परिणाम काफी भिन्न होंगे यदि ऑप्टिमाइज़र लक्ष्य ALL_ROWS के बजाय FIRST_ROWS(n) था - इस स्थिति में ऑप्टिमाइज़र प्लान 2 का पक्ष लेगा क्योंकि यह पूरी क्वेरी के लिए कम कुशल होने की कीमत पर अक्सर पहली कुछ पंक्तियों को जल्दी वापस कर देगा। ।