SQL एक घोषणात्मक भाषा है, प्रक्रियात्मक भाषा नहीं। यही है, आप अपने इच्छित परिणामों का वर्णन करने के लिए एक SQL कथन बनाते हैं। आप SQL इंजन को नहीं बता रहे हैं कैसे काम करने के लिए।
एक सामान्य नियम के रूप में, SQL इंजन और SQL अनुकूलक को सर्वोत्तम क्वेरी योजना खोजने देना एक अच्छा विचार है। SQL इंजन को विकसित करने के लिए कई व्यक्ति-वर्षों का प्रयास किया जाता है, इसलिए इंजीनियरों को वह करने दें जो वे जानते हैं कि कैसे करना है।
बेशक, ऐसी स्थितियां हैं जहां क्वेरी योजना इष्टतम नहीं है। फिर आप बेहतर प्रदर्शन प्राप्त करने के लिए क्वेरी संकेतों का उपयोग करना चाहते हैं, क्वेरी को पुनर्गठित करना, आंकड़े अपडेट करना, अस्थायी तालिकाओं का उपयोग करना, अनुक्रमणिका जोड़ना आदि।
जहाँ तक आपके प्रश्न का है। सिद्धांत रूप में, CTE और उपश्रेणियों का प्रदर्शन समान होना चाहिए, क्योंकि दोनों ही क्वेरी ऑप्टिमाइज़र को समान जानकारी प्रदान करते हैं। एक अंतर यह है कि एक से अधिक बार उपयोग किए जाने वाले सीटीई को आसानी से पहचाना जा सकता है और एक बार गणना की जा सकती है। फिर परिणाम कई बार संग्रहीत और पढ़े जा सकते हैं। दुर्भाग्य से, SQL सर्वर इस मूल अनुकूलन पद्धति का लाभ नहीं उठा रहा है (आप इसे सामान्य सबक्वेरी उन्मूलन कह सकते हैं)।
अस्थायी तालिका एक अलग मामला है, क्योंकि आप क्वेरी को कैसे चलाना चाहिए, इस बारे में अधिक मार्गदर्शन प्रदान कर रहे हैं। एक बड़ा अंतर यह है कि अनुकूलक अपनी क्वेरी योजना स्थापित करने के लिए अस्थायी तालिका के आंकड़ों का उपयोग कर सकता है। इसके परिणामस्वरूप प्रदर्शन लाभ हो सकता है। साथ ही, यदि आपके पास एक जटिल सीटीई (सबक्वायरी) है जिसका उपयोग एक से अधिक बार किया जाता है, तो इसे अस्थायी तालिका में संग्रहीत करने से अक्सर प्रदर्शन को बढ़ावा मिलेगा। क्वेरी केवल एक बार निष्पादित की जाती है।
आपके प्रश्न का उत्तर यह है कि आपको अपेक्षित प्रदर्शन प्राप्त करने के लिए इधर-उधर खेलने की आवश्यकता है, विशेष रूप से उन जटिल प्रश्नों के लिए जो नियमित रूप से चलाए जाते हैं। एक आदर्श दुनिया में, क्वेरी ऑप्टिमाइज़र को सही निष्पादन पथ मिलेगा। हालांकि ऐसा अक्सर होता है, हो सकता है कि आप बेहतर प्रदर्शन पाने का कोई तरीका ढूंढ सकें।