मेरे पास समान SQL Server 2005 आवृत्ति पर चलने वाले दो समान प्रश्न हैं:
- पहला
SELECT
प्रश्न LINQ द्वारा उत्पन्न मूल क्वेरी है (मुझे पता है, मुझे पता है ... मैं एप्लिकेशन डेवलपर नहीं हूँ, बस DBA :)। - दूसरा वाला पहले वाले के समान ही है,
OPTION (RECOMPILE)
अंत में जोड़ा गया है ।
और कुछ नहीं बदला गया है।
पहले वाले को हर बार 55 सेकंड का समय लगता है।
दूसरे को 2 सेकंड लगते हैं।
दोनों परिणाम सेट समान हैं।
यह संकेत प्रदर्शन में इतना नाटकीय लाभ क्यों पैदा करेगा?
पुस्तकें ऑनलाइन प्रविष्टि RECOMPILE
बहुत विस्तृत विवरण प्रस्तुत नहीं करती है:
SQL सर्वर डेटाबेस इंजन क्वेरी के लिए जेनरेट की गई योजना को निष्पादित करने के बाद छोड़ने के लिए निर्देश देता है, जिससे क्वेरी ऑप्टिमाइज़र एक क्वेरी प्लान को फिर से शुरू करने के लिए मजबूर करता है जब उसी क्वेरी को निष्पादित किया जाता है। RECOMPILE को निर्दिष्ट किए बिना, डेटाबेस इंजन क्वेरी प्लान करता है और उनका पुन: उपयोग करता है। क्वेरी योजनाओं को संकलित करते समय, RECOMPILE क्वेरी संकेत क्वेरी में किसी भी स्थानीय चर के वर्तमान मूल्यों का उपयोग करता है और यदि क्वेरी किसी संग्रहीत कार्यविधि के अंदर है, तो वर्तमान मान किसी भी पैरामीटर को पारित कर दिया है।
RECOMPILE एक संग्रहीत कार्यविधि बनाने के लिए एक उपयोगी विकल्प है जो RECOMPILE क्लॉज का उपयोग करता है जब केवल संग्रहीत कार्यविधि के अंदर प्रश्नों का एक सबसेट, पूरे संग्रहीत कार्यविधि के बजाय पुन: संकलित किया जाना चाहिए। अधिक जानकारी के लिए, संग्रहित संग्रहीत प्रक्रियाएँ देखें। जब आप योजना मार्गदर्शिका बनाते हैं, तो RECOMPILE भी उपयोगी होती है। अधिक जानकारी के लिए, योजना मार्गदर्शिका का उपयोग करके तैनात अनुप्रयोगों में क्वेरीज़ को अनुकूलित करना देखें।
चूंकि मेरी क्वेरी में बहुत सारे स्थानीय चर हैं, इसलिए मेरा अनुमान है कि जब मैं OPTION (RECOMPILE)
क्वेरी संकेत का उपयोग करता हूं, तो SQL सर्वर इसे (गंभीरता से) सक्षम करता है ।
हर जगह मुझे लगता है कि लोग कह रहे हैं कि OPTION (RECOMPILE)
इससे बचना चाहिए। इसके लिए स्पष्टीकरण आमतौर पर यह है कि इस संकेत SQL सर्वर का उपयोग इस छूट योजना का पुन: उपयोग करने में सक्षम नहीं है और इसलिए इसे हर बार recompiling समय बर्बाद करना पड़ता है।
(लेकिन) विशाल प्रदर्शन लाभ को देखते हुए, मैं यह सोचने के लिए इच्छुक हूं कि इस बार इस क्वेरी का उपयोग करना एक अच्छी बात होगी।
क्या मुझे इसका उपयोग करना चाहिए? यदि नहीं, तो क्या कोई तरीका है जो मैं SQL सर्वर को इस संकेत के बिना और एप्लिकेशन को परिवर्तित किए बिना बेहतर निष्पादन योजना का उपयोग करने के लिए मजबूर कर सकता हूं?