मैंने अनुमान लगाया होगा कि जब किसी क्वेरी में TOP n शामिल होता है, तो डेटाबेस इंजन TOP क्लॉज को अनदेखा करते हुए क्वेरी को रन करेगा, और फिर अंत में उस परिणाम को कम कर देगा, जो अनुरोध की गई पंक्तियों की संख्या के नीचे सेट है। चित्रमय निष्पादन योजना यह इंगित करती है कि यह मामला है - TOP "अंतिम" चरण है। लेकिन ऐसा लगता है कि वहाँ अधिक चल रहा है।
जिस तरह से ऊपर को अभिव्यक्त किया गया है, मुझे लगता है कि आपके पास एक गलत मानसिक तस्वीर हो सकती है कि क्वेरी कैसे निष्पादित होती है। एक क्वेरी योजना में एक ऑपरेटर एक कदम नहीं है (जहां पिछले चरण के पूर्ण परिणाम सेट का मूल्यांकन अगले एक द्वारा किया जाता है।
SQL सर्वर एक पाइपलाइन किए गए निष्पादन मॉडल का उपयोग करता है , जहां प्रत्येक ऑपरेटर Init () , GetRow () और Close () जैसे तरीकों को उजागर करता है । जैसा कि GetRow () नाम से पता चलता है, एक ऑपरेटर मांग पर एक समय में एक पंक्ति बनाता है (जैसा कि इसके मूल ऑपरेटर द्वारा आवश्यक है)। यह पुस्तकें ऑनलाइन लॉजिकल एंड फिजिकल ऑपरेटर्स संदर्भ में प्रलेखित है , मेरे ब्लॉग पोस्ट में और अधिक विस्तार के साथ क्यों प्रश्न योजनाएं पीछे की ओर चलती हैं । यह पंक्ति-ए-टाइम मॉडल क्वेरी निष्पादन के लिए ध्वनि अंतर्ज्ञान बनाने में आवश्यक है।
मेरा सवाल है, कैसे (और क्यों) TOP
एन क्लॉज़ किसी क्वेरी के निष्पादन योजना को प्रभावित करता है ?
कुछ लॉजिकल ऑपरेशंस जैसे TOP
, सेमी जॉइन और FAST n
क्विक हिंट , क्वेरी ऑप्टिमाइज़र के एक्जीक्यूशन प्लान के ऑल्टरनेटिव्स को प्रभावित करने के तरीके को प्रभावित करते हैं। मूल विचार यह है कि एक संभव योजना आकार पहले n पंक्तियों को एक अलग योजना की तुलना में अधिक तेज़ी से वापस कर सकता है जो सभी पंक्तियों को वापस करने के लिए अनुकूलित किया गया था।
उदाहरण के लिए, अनुक्रमित नेस्टेड छोरों में शामिल होने के लिए अक्सर छोटी संख्या में पंक्तियों को वापस करने का सबसे तेज़ तरीका होता है, हालांकि स्कैन के साथ हैश या मर्ज जुड़ना बड़े सेट पर अधिक कुशल हो सकता है। इन विकल्पों के बारे में क्वेरी ऑप्टिमाइज़र जिस तरह से संचालन के तार्किक पेड़ में एक विशेष बिंदु पर एक पंक्ति लक्ष्य निर्धारित करके है ।
एक पंक्ति लक्ष्य उस तरीके को संशोधित करता है जिस तरह से विकल्प की लागत होती है। इसका सार यह है कि ऑप्टिमाइज़र प्रत्येक ऑपरेटर की लागत से शुरू होता है जैसे कि पूर्ण परिणाम सेट की आवश्यकता होती है, उचित बिंदु पर एक पंक्ति लक्ष्य निर्धारित करता है, और फिर योजना पेड़ पर काम करता है जो पंक्तियों की संख्या का अनुमान लगाता है, इसकी जांच करने की अपेक्षा करता है पंक्ति लक्ष्य पूरा करने के लिए।
उदाहरण के लिए, एक तार्किक TOP(10)
लॉजिकल क्वेरी ट्री में एक विशेष बिंदु पर 10 का एक पंक्ति लक्ष्य सेट करता है। पंक्ति लक्ष्य तक पहुंचने वाले ऑपरेटरों की लागत को अनुमान लगाने के लिए संशोधित किया जाता है कि पंक्ति लक्ष्य को पूरा करने के लिए उन्हें कितनी पंक्तियों का उत्पादन करने की आवश्यकता होती है। यह गणना जटिल बन सकती है, इसलिए इसे पूरी तरह से काम करने वाले उदाहरण और एनोटेट निष्पादन योजनाओं के साथ समझना आसान है । पंक्ति के लक्ष्यों में शामिल होने के विकल्प की तुलना में अधिक प्रभावित हो सकता है या क्या स्कैन की तलाश और लुकअप पसंद किए जाते हैं। उस पर अधिक जानकारी यहाँ ।
हमेशा की तरह, पंक्ति लक्ष्य के आधार पर चुनी गई एक निष्पादन योजना ऑप्टिमाइज़र की तर्क क्षमता और उसे प्रदान की गई जानकारी की गुणवत्ता के अधीन है। एक पंक्ति लक्ष्य के साथ हर योजना अभ्यास में तेजी से आवश्यक पंक्तियों की संख्या का उत्पादन नहीं करेगी, लेकिन लागत मॉडल के अनुसार यह करेगी।
जहां एक पंक्ति लक्ष्य योजना तेजी से साबित नहीं होती है, आमतौर पर क्वेरी को संशोधित करने या ऑप्टिमाइज़र को बेहतर जानकारी प्रदान करने के तरीके हैं जैसे कि स्वाभाविक रूप से चयनित योजना सबसे अच्छा है। आपके मामले में कौन सा विकल्प उपयुक्त है, यह पाठ्यक्रम के विवरण पर निर्भर करता है। पंक्ति लक्ष्य सुविधा आम तौर पर बहुत प्रभावी होती है (हालांकि एक है समानांतर निष्पादन योजनाओं में उपयोग किए जाने के लिए यह देखने के लिए बग है)।
आपकी विशेष क्वेरी और योजना यहां विस्तृत विश्लेषण के लिए उपयुक्त नहीं हो सकती है (यदि आप चाहें तो हर तरह से वास्तविक निष्पादन योजना प्रदान करें) लेकिन उम्मीद है कि यहां उल्लिखित विचार आपको आगे बढ़ने की अनुमति देंगे।
ORDER BY
क्लॉज है।TOP
इस प्रकार की योजना में होने वाले परिवर्तनों को जोड़ते हुए, लेकिन मैं इस बारे में अधिक चिंतित हूं कि यह तालिका बी के खिलाफ सूचकांक के निष्पादन की संख्या को कैसे प्रभावित करता है ... (बेशक दोनों संबंधित हो सकते हैं - मुझे नहीं पता)