2010-01-04 11 views
9

जब मैं पहली बार एक निश्चित संग्रहीत प्रक्रिया चलाता हूं तो इसे समाप्त होने में लगभग 2 मिनट लगते हैं। जब मैं इसे दूसरी बार चलाता हूं तो यह लगभग 15 सेकंड में समाप्त होता है। मुझे लगता है कि ऐसा इसलिए है क्योंकि पहले रन के बाद सब कुछ कैश किया जाता है। क्या पहली बार इस प्रक्रिया को चलाने से पहले मेरे लिए "कैश गर्म करना" संभव है? क्या कैश की गई जानकारी केवल तभी उपयोग की जाती है जब मैं उसी पैरामीटर के साथ एक ही संग्रहीत प्रक्रिया को दोबारा कॉल करता हूं या यदि मैं अलग-अलग पैरा के साथ एक ही संग्रहीत प्रक्रिया को कॉल करता हूं तो इसका उपयोग किया जाएगा?SQL सर्वर कैश प्रश्न

उत्तर

9

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

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

तो आपका प्रश्न वास्तव में क्या पूछ रहा है "क्या मुझे डेटा ब्लॉक जो मुझे स्मृति में पढ़ने के बिना स्मृति में चाहिए (वास्तव में एक प्रश्न कर रहा है)?"। जवाब नहीं है, जब तक कि आप पूरी तालिकाओं को कैश नहीं करना चाहते हैं और उन्हें स्थायी रूप से स्मृति में रहते हैं, जो क्वेरी समय (और इस प्रकार डेटा आकार) से आप वर्णन कर रहे हैं, शायद यह एक अच्छा विचार नहीं है।

प्रदर्शन सुधार के लिए आपकी सबसे अच्छी शर्त आपकी क्वेरी निष्पादन योजनाओं को देख रही है और यह देखकर कि आपकी अनुक्रमणिका बदलना बेहतर परिणाम दे सकता है या नहीं।

  • एक सूचकांक जहां पूछताछ वह इस्तेमाल कर सकते हैं अक्षम प्रश्नों और पूर्ण तालिका स्कैन
  • एक सूचकांक के लिए और अधिक कॉलम जोड़ने से बचने के लिए एक दूसरे डिस्क पढ़ने से बचने के लिए बनाने: वहाँ दो प्रमुख क्षेत्रों है कि यहां के प्रदर्शन में सुधार कर सकते हैं। उदाहरण के लिए, आपके पास एक क्वेरी है जो ए और सी पर क्लॉज के साथ कॉलम ए, और बी लौटाती है और आपके पास कॉलम ए पर एक इंडेक्स है। आपकी क्वेरी कॉलम ए के लिए इंडेक्स का उपयोग करेगी जिसमें एक डिस्क पढ़ने की आवश्यकता होती है लेकिन फिर दूसरी डिस्क की आवश्यकता होती है कॉलम बी और सी प्राप्त करने के लिए हिट करें। यदि इंडेक्स में सभी कॉलम ए, बी और सी थे, तो डेटा प्राप्त करने के लिए दूसरी डिस्क हिट से बचा जा सकता है।
-1

निष्पादन योजना (आपकी प्रक्रिया के लिए कैश की गई जानकारी) विभिन्न मानकों के साथ भी हर बार पुन: उपयोग की जाती है। यह संग्रहीत प्रोसेस का उपयोग करने के लाभों में से एक है।

पहली बार संग्रहित प्रक्रिया निष्पादित की जाती है, SQL सर्वर निष्पादन योजना उत्पन्न करता है और इसे प्रक्रिया कैश में रखता है।

डेटाबेस में कुछ परिवर्तन निष्पादन योजना के स्वचालित अपडेट को ट्रिगर कर सकते हैं (और आप स्पष्ट रूप से एक पुनर्मूल्यांकन की मांग भी कर सकते हैं)।

निष्पादन योजनाओं को उनकी "आयु" के आधार पर प्रक्रिया कैश से हटा दिया जाता है। (एमएसडीएन से: ऑब्जेक्ट्स को अक्सर संदर्भित करने के लिए जल्द ही विलोपन के लिए पात्र होते हैं, लेकिन वास्तव में तब तक नहीं हटाए जाते हैं जब तक अन्य वस्तुओं के लिए स्मृति की आवश्यकता नहीं होती है।)

मुझे नहीं लगता कि प्रदर्शन करने के अलावा "कैश को गर्म करने" का कोई तरीका है एक बार संग्रहीत प्रोसेस। यह गारंटी देगा कि कैश में निष्पादन योजना है और बाद में किसी भी कॉल का पुन: उपयोग किया जाएगा।

अधिक विस्तृत जानकारी MSDN प्रलेखीकरण में उपलब्ध है: http://msdn.microsoft.com/en-us/library/ms181055(SQL.90).aspx

+4

आपकी प्रतिक्रिया है, हालांकि मैं कुछ भी इसके साथ गलत नहीं देख सकते हैं, बिंदु याद करते हैं। क्वेरी संकलन में 1 एम 45 नहीं लगता है, इसलिए यह ओपी का मुद्दा नहीं है। ओपीएस कैशिंग मुद्दों को डेटा पेज कैश के साथ करना है, निष्पादन योजना कैश नहीं। – erikkallen

3

मुझे नहीं लगता कि कि कार्य योजना लागू करके पैदा अधिक है कि 1 सेकंड खर्च होंगे।

मेरा मानना ​​है कि पहले और दूसरे रन के बीच का अंतर स्मृति में डेटा को कैशिंग करके होता है।

कैश में डेटा किसी और क्वेरी (संग्रहित प्रक्रिया या सरल चयन) द्वारा पुन: उपयोग किया जा सकता है।

आप उसी डेटा को पढ़ने वाले किसी भी चयन के माध्यम से डेटा को पढ़कर कैश को 'गर्म' कर सकते हैं। लेकिन इसके बारे में 90 सेकंड भी खर्च होंगे।

2

आप यह निष्कर्ष निकालने के लिए निष्पादन योजना की जांच कर सकते हैं कि आपकी क्वेरी किस तालिका और अनुक्रमणिका का उपयोग करती है। फिर आप जो कुछ देखते हैं उसके आधार पर कैश में डेटा प्राप्त करने के लिए आप कुछ एसक्यूएल निष्पादित कर सकते हैं।

  • यदि आप क्लस्टर्ड इंडेक्स की तलाश देखते हैं, तो आप सभी तालिका के डेटा पृष्ठों को कैश में मजबूर करने के लिए बस SELECT * FROM my_big_table कर सकते हैं।
  • यदि आप एक गैर-क्लस्टर इंडेक्स की तलाश देखते हैं, तो आप SELECT first_column_in_index FROM my_big_table आज़मा सकते हैं।

किसी विशिष्ट अनुक्रमणिका के भार को मजबूर करने के लिए, आप अपने कैश हॉटअप क्वेरी में WITH(INDEX(index)) तालिका संकेत का भी उपयोग कर सकते हैं।