क्वेरी क्वेरी संकेत का उपयोग करते समय प्रश्नों के बीच निष्पादन समय में अंतर


16

मेरे पास समान SQL Server 2005 आवृत्ति पर चलने वाले दो समान प्रश्न हैं:

  1. पहला SELECTप्रश्न LINQ द्वारा उत्पन्न मूल क्वेरी है (मुझे पता है, मुझे पता है ... मैं एप्लिकेशन डेवलपर नहीं हूँ, बस DBA :)।
  2. दूसरा वाला पहले वाले के समान ही है, OPTION (RECOMPILE)अंत में जोड़ा गया है ।

और कुछ नहीं बदला गया है।

पहले वाले को हर बार 55 सेकंड का समय लगता है।
दूसरे को 2 सेकंड लगते हैं।

दोनों परिणाम सेट समान हैं।

यह संकेत प्रदर्शन में इतना नाटकीय लाभ क्यों पैदा करेगा?

पुस्तकें ऑनलाइन प्रविष्टि RECOMPILEबहुत विस्तृत विवरण प्रस्तुत नहीं करती है:

SQL सर्वर डेटाबेस इंजन क्वेरी के लिए जेनरेट की गई योजना को निष्पादित करने के बाद छोड़ने के लिए निर्देश देता है, जिससे क्वेरी ऑप्टिमाइज़र एक क्वेरी प्लान को फिर से शुरू करने के लिए मजबूर करता है जब उसी क्वेरी को निष्पादित किया जाता है। RECOMPILE को निर्दिष्ट किए बिना, डेटाबेस इंजन क्वेरी प्लान करता है और उनका पुन: उपयोग करता है। क्वेरी योजनाओं को संकलित करते समय, RECOMPILE क्वेरी संकेत क्वेरी में किसी भी स्थानीय चर के वर्तमान मूल्यों का उपयोग करता है और यदि क्वेरी किसी संग्रहीत कार्यविधि के अंदर है, तो वर्तमान मान किसी भी पैरामीटर को पारित कर दिया है।

RECOMPILE एक संग्रहीत कार्यविधि बनाने के लिए एक उपयोगी विकल्प है जो RECOMPILE क्लॉज का उपयोग करता है जब केवल संग्रहीत कार्यविधि के अंदर प्रश्नों का एक सबसेट, पूरे संग्रहीत कार्यविधि के बजाय पुन: संकलित किया जाना चाहिए। अधिक जानकारी के लिए, संग्रहित संग्रहीत प्रक्रियाएँ देखें। जब आप योजना मार्गदर्शिका बनाते हैं, तो RECOMPILE भी उपयोगी होती है। अधिक जानकारी के लिए, योजना मार्गदर्शिका का उपयोग करके तैनात अनुप्रयोगों में क्वेरीज़ को अनुकूलित करना देखें।

चूंकि मेरी क्वेरी में बहुत सारे स्थानीय चर हैं, इसलिए मेरा अनुमान है कि जब मैं OPTION (RECOMPILE)क्वेरी संकेत का उपयोग करता हूं, तो SQL सर्वर इसे (गंभीरता से) सक्षम करता है ।

हर जगह मुझे लगता है कि लोग कह रहे हैं कि OPTION (RECOMPILE)इससे बचना चाहिए। इसके लिए स्पष्टीकरण आमतौर पर यह है कि इस संकेत SQL सर्वर का उपयोग इस छूट योजना का पुन: उपयोग करने में सक्षम नहीं है और इसलिए इसे हर बार recompiling समय बर्बाद करना पड़ता है।
(लेकिन) विशाल प्रदर्शन लाभ को देखते हुए, मैं यह सोचने के लिए इच्छुक हूं कि इस बार इस क्वेरी का उपयोग करना एक अच्छी बात होगी।

क्या मुझे इसका उपयोग करना चाहिए? यदि नहीं, तो क्या कोई तरीका है जो मैं SQL सर्वर को इस संकेत के बिना और एप्लिकेशन को परिवर्तित किए बिना बेहतर निष्पादन योजना का उपयोग करने के लिए मजबूर कर सकता हूं?

जवाबों:


16

Microsoft SQL Server 2005 में क्वेरी ऑप्टिमाइज़र द्वारा प्रयुक्त लेख सांख्यिकी में दस्तावेज के रूप में

यदि आप किसी पैरामीटर या शाब्दिक के बजाय क्वेरी में एक स्थानीय चर का उपयोग करते हैं, तो ऑप्टिमाइज़र कम-गुणवत्ता वाले अनुमान का अनुमान लगाता है, या विधेय की चयनात्मकता का अनुमान लगाता है। स्थानीय चर के बजाय क्वेरी में पैरामीटर या शाब्दिक का उपयोग करें

जब किसी कॉलम के लिए ऑप्टिमाइज़र के पास कोई उपयोग करने योग्य आँकड़े नहीं हैं, तो यह अनुमान= लगाएगा कि एक विधेय 10% पंक्तियों, BETWEEN9% और किसी भी >, >=, < and <=30% से मेल खाएगा। यदि कॉलम आँकड़े उपलब्ध हैं तो एक =विधेय को नीचे के रूप में अलग तरह से माना जाएगा।

यहां तक ​​कि जब स्थानीय चर का उपयोग क्वेरी में किया जाता है, तो एक अनुमान जो अनुमान से बेहतर होता है, का उपयोग समानता की भविष्यवाणी के मामले में किया जाता है। प्रपत्र की शर्तों के @local_variable = column_nameलिए चयनशीलता " " स्तंभ_नाम के लिए हिस्टोग्राम से औसत मूल्य आवृत्ति का उपयोग करके अनुमानित की जाती है। इसलिए, उदाहरण के लिए, यदि स्तंभ column_name में सभी अनन्य मान हैं, तो एक चयनात्मकता अनुमान का 1/(number of unique values in column)उपयोग किया जाएगा, जो सटीक है।

तो यह अनिवार्य रूप से के लिए उपयोग के रूप में ही है OPTIMIZE FOR (UNKNOWN)। यह एक सपाट 10%अनुमान से अधिक सटीक हो सकता है लेकिन यह उन विशिष्ट मूल्यों के अनुरूप नहीं है जिन्हें आप क्वेरी कर रहे हैं।

SQL सर्वर को किसी भी समय चलने वाली क्वेरी को ऑप्टिमाइज़ करने के लिए बाध्य करने के लिए, और क्वेरी के ऑप्टिमाइज़ेशन के दौरान कार्डिनैलिटी और लागत का अनुमान लगाने के लिए स्थानीय वेरिएबल्स के मूल्यों का उपयोग करें, RECOMPILEक्वेरी के लिए क्वेरी संकेत जोड़ें ।

RECOMPILEआप के उपयोग के साथ संभवतः अधिक सटीक कार्डिनैलिटी का अनुमान हो रहा है और इसलिए एक अलग योजना है जिसमें शामिल हों ऑर्डर / ज्वाइन प्रकार जो आपकी वास्तविक क्वेरी के विभिन्न हिस्सों से लौटी पंक्तियों की संख्या के अधिक अनुकूल हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.