एमएस SQL ​​सर्वर में कुंवारी प्रश्नों के प्रदर्शन को कैसे बढ़ाया जाए?


10

मेरे पास ASP.NET वेब साइट है जो डेटा की अपनी स्वतंत्र कैशिंग करती है और डेटा लंबे समय तक परिवर्तित नहीं होता है, इसलिए इसे SQL Server दूसरी बार उसी क्वेरी से क्वेरी करने की आवश्यकता नहीं है। मुझे पहली बार (कुंवारी) प्रश्नों के प्रदर्शन में सुधार करने की आवश्यकता है जो उस SQL ​​सर्वर पर जाते हैं। कुछ क्वेरीज़ इतना डेटा प्रोसेस करती हैं कि वे SQL सर्वर का उपयोग कर सकते हैं tempdb। मैं अस्थायी तालिका चर या अस्थायी तालिकाओं का उपयोग नहीं करता, इसलिए SQL सर्वर tempdbजब भी आवश्यकता होती है, तब तक स्वयं इसका उपयोग करने का निर्णय लेता है।

मेरे db का आकार 16Gb है, मेरे पास अपने सर्वर मशीन पर 32Gb की भौतिक RAM उपलब्ध है।

मैं समझता हूं कि एमएस एसक्यूएल सर्वर कैशिंग रणनीति समान प्रश्नों के प्रदर्शन को गति देने के लिए रैम में डेटा रखने की कोशिश करती है अगर उन्हें फिर से लोड करने के लिए समान डेटा की आवश्यकता होती है। इसके अलावा यह डिस्क एक्सेस का कारण बनाए बिना स्पीड-अप प्रदर्शन के लिए अस्थायी रैम के बजाय उपलब्ध रैम का उपयोग करने की कोशिश करेगा।

मुझे लगता है कि जब क्वेरी कि tempdb SQL सर्वर में कुछ स्टोर करने की जरूरत है और पर्याप्त रैम उपलब्ध नहीं है, SQL सर्वर 2% उपलब्ध है:

1) कुछ कैश किए गए डेटा को अनलोड करने के लिए और डिस्क लिखने से बचने के लिए tempdb के बजाय स्प्रेड रैम का उपयोग करें

2) भविष्य के प्रश्नों के लिए कैश्ड डेटा रखें और tempdb का उपयोग करना शुरू करें, जो धीमी डिस्क को लिखता है।

मुझे नहीं पता कि एसक्यूएल सर्वर इस स्थिति में क्या विकल्प देगा, लेकिन मैं इसे # 1 पसंद करना चाहूंगा क्योंकि मैं केवल पहली बार (कुंवारी) प्रश्नों के प्रदर्शन के बारे में परवाह करता हूं, क्योंकि मैं एसक्यूएल सर्वर को फिर से एक ही क्वेरी नहीं भेजता। (हालांकि मैं इसी तरह का प्रश्न भेज सकता हूं)।

इस परिदृश्य के लिए SQL सर्वर कैशिंग रणनीति क्या है?

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

क्या SQL सर्वर को इस तरह से कॉन्फ़िगर करना संभव है कि वह # 1 विकल्प बना सके? यदि हाँ तो कैसे?

मैं सभी कुंवारी एसक्यूएल प्रश्नों का प्रदर्शन कैसे बढ़ा सकता हूं?

चूँकि मैं SQL Server कैशिंग रणनीति के बारे में नहीं जानता, इसलिए मैं RAM डिस्क पर डेटाबेस रखना चाहता हूँ। यह सुनिश्चित करेगा कि किसी भी कुंवारी क्वेरी में बिना डेटा के लोड होने की उच्च गति है, भले ही SQL सर्वर हमेशा # 1 विकल्प बनाता है। इसका जोखिम यह है कि एसक्यूएल सर्वर कम उपलब्ध रैम के साथ अधिक टीडीपीडीबी का उपयोग करना शुरू कर सकता है (केवल 16 जीबी के बाद मैं 16 जीबी का उपयोग रैम डिस्क के लिए करता हूं) यदि यह विकल्प # 2 बना रहा है, जो उन कुंवारी प्रश्नों को धीमा कर देगा जो स्पिल का कारण बनते हैं tempdb

मुझे SQL 2008 R2 के लिए समाधान में दिलचस्पी है, लेकिन मुझे लगता है कि यह संभवतः SQL 2008, SQL 2005 के लिए समान है और SQL 2000 हो सकता है।

स्पष्टीकरण:

उस बॉक्स पर कोई अन्य अनुप्रयोग नहीं चल रहा है, यह SQL सर्वर को समर्पित है । वेबसाइट अलग बॉक्स पर चलती है।

यह SQL Server 2008 R2 मानक संस्करण 64 बिट Windows Server 2008 R2 एंटरप्राइज़ 64 बिट पर है।

मैं केवल रीड-ओनली क्वेरीज़ चलाता हूं और डेटाबेस को केवल-पढ़ने के लिए सेट किया जाता है ।

मान लेते हैं कि पहले से ही अच्छे सूचकांक हैं । यह सवाल SQL सर्वर मेकिंग चॉइस # 1 बनाम चॉइस # 2 के बारे में है, यह इसे कैसे बनाता है, अगर इसे नियंत्रित करने का कोई तरीका है और यदि RAM डिस्क कुंवारी प्रश्नों के लिए सही विकल्प बनाने में मदद करती है।


आपको क्या लगता है कि टेम्पर्डबी का उपयोग किया जा रहा है भले ही आप टेम्प टेबल नहीं बना रहे हों? क्या आप टेबल द्वारा अलग या समूह का उपयोग कर रहे हैं?
डारिन स्ट्रेट

3
32/64 बिट? भौतिक या आभासी? क्या यह सर्वर SQL सर्वर को समर्पित है या आप भी उसी बॉक्स पर IIS या अन्य ऐप चला रहे हैं? क्या आपने क्वेरी निष्पादन योजना का कोई विश्लेषण किया है? क्या आप उदाहरण प्रश्न और / या निष्पादन योजना पोस्ट कर सकते हैं? और भाग्य के लिए एक और ... अपनी समस्या क्वेरी चल रही है और आउटपुट पोस्ट करते समय केंद्र के लॉगिंग sp_whoisactive का पालन ​​करें ।
मार्क स्टोरी-स्मिथ

@darinstrait सबसे अधिक संभावना स्पष्टीकरण एक प्रकार या हैश स्पिल होगा।
मार्क स्टोरी-स्मिथ

जवाबों:


7

आपका प्रश्न मूल रूप से 'क्वेरी मेमोरी अनुदान कैसे काम करता है?' के रूप में प्रतिरूपित किया जा सकता है। इस विषय पर एक अच्छा पढ़ा SQL सर्वर स्मृति अनुदान समझ रहा है । किसी क्वेरी को निष्पादन में लॉन्च करने से पहले उसे सॉर्ट और हैश और अन्य मेमोरी भूख संचालन के लिए मेमोरी अनुदान की आवश्यकता हो सकती है। यह स्मृति अनुदान एक अनुमान है । वर्तमान प्रणाली की स्थिति (चलने और लंबित, उपलब्ध मेमोरी आदि की संख्या) के आधार पर, सिस्टम क्वेरी को आवश्यक राशि तक मेमोरी अनुदान देता है । एक बार स्मृति प्रदान करने के बाद, क्वेरी निष्पादन शुरू कर देती है (इसे अनुदान प्राप्त करने से पहले खतरनाक 'संसाधन सेमाफोर' कतार में इंतजार करना पड़ सकता है)। निष्पादन के समय यह स्मृति अनुदान की गारंटी हैसिस्टम द्वारा। मेमोरी की यह राशि डेटा पेजों के साथ साझा की जा सकती है (क्योंकि वे हमेशा डिस्क को फ्लश कर सकते हैं) लेकिन कभी भी अन्य मेमोरी उपयोग के साथ नहीं (यानी; यह 'चोरी' के अधीन नहीं हो सकता)। इसलिए जब क्वेरी अपने अनुदान से प्रतिबद्ध मेमोरी के लिए पूछना शुरू कर देती है, तो इंजन उस कार्य को तैनात करेगा जिसे आप 'रणनीति # 1' कहते हैं: क्वेरी को स्मृति देने के लिए डेटा पृष्ठों को बेदखल किया जा सकता है (फ्लश किया गया हो )। अब यदि अनुमान सही था और अनुदान अनुरोधित मेमोरी का 100% था, तो प्रश्न 'स्पिल' नहीं होना चाहिए। लेकिन अगर अनुमान गलत था (कार्डिनैलिटी के अनुमानों के कारण उबलता है, इसलिए बासी आँकड़ों के अधीन है) या यदि क्वेरी को वह पूरा अनुदान नहीं मिला, जो उसने माँगा था, तो क्वेरी 'स्पिल' होगी। यह तब होता है जब टेम्पर्ड पिक्चर और परफॉर्मेंस आमतौर पर टैंक में आते हैं।

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

अब अपने मूल प्रश्न पर वापस चलते हैं। यदि आपकी जांच सही है (बहुत बड़ी है तो) मैं दो समस्याओं को इंगित करना चाहूंगा:

  • आप एक वेब साइट के लिए मेमोरी अनुदान की आवश्यकता वाले उत्पादन प्रश्नों में भाग लेते हैं । यह एक बड़ा नहीं-नहीं है। मेमोरी अनुदान उन विश्लेषणात्मक प्रश्नों का संकेत है जिनका HTTP अनुरोधों की सेवा में कोई स्थान नहीं है।
  • आपके प्रश्न संभवतः स्मृति अनुदान के लिए घटना नहीं हैं जो वे अनुरोध करते हैं। फिर से, वेब साइटों के रूप में एक विलंबता महत्वपूर्ण कार्यभार के लिए और भी नहीं-नहीं।

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


@ मर्क: अधिकांश प्रश्नों के लिए कोई मेमोरी अनुदान की आवश्यकता नहीं होती है। केवल कुछ ऑपरेटरों (सबसे विशेष रूप से सॉर्ट और हैश जॉइन) को एक कार्य बफर की आवश्यकता होती है और इस प्रकार अनुदान का अनुरोध करते हैं। यह मानक 'नामकरण' है। आप निष्पादन पर्यावरण और क्वेरी निष्पादन योजना के बारे में सोच रहे होंगे, जिनमें से हर एक क्वेरी के लिए एक की आवश्यकता होती है और इसमें कुछ मेमोरी शामिल होती है । एक मेमोरी अनुदान बहुत बड़ा है (एमबी)। दूसरे, देखो sys.dm_exec_query_memory_grants: आपके पास requested(अधिकतम), required(मिनट) और granted(वास्तविक)।
रेमस रूसु

क्षमा याचना। मैंने कहीं से उठाया था कि न्यूनतम प्रति क्वेरी उसी मेमोरी क्लर्क से आवंटित की गई थी, जो गलत था।
मार्क स्टोरी-स्मिथ

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

ओपी का दावा है कि इसमें सभी आवश्यक सूचकांक हैं। यदि यह सच है और कार्यभार के पास पर्याप्त मेमोरी अनुदान (और यहां तक ​​कि स्पिल) के मुद्दे हैं, जो ध्यान देने योग्य हैं, तो मैं कहूंगा कि काम का बोझ एक वेब साइट के लिए बहुत विश्लेषणात्मक है । अंततः मूल प्रदर्शन हमेशा मूल कारण निर्धारित करने के लिए जांच का एक खेल है। सभी कंबल बयान और प्रतिबंध हमेशा एक काउंटर उदाहरण पाए जाते हैं जो उन्हें गलत साबित करता है, जो कि एक दिया गया है। क्या ओपी के पास एक डिज़ाइन मुद्दा है जो बहुत अधिक विश्लेषणात्मक कार्यभार बनाता है? मुझे नहीं पता। क्या मुझे लगता है कि यह करता है? मैं 87.5% विश्वास हाँ कहूँगा।
रेमस रूसु

@Remus: आपका अनुमान अच्छा था, मेरी वेब साइट क्वेरीज़ 100% विश्लेषणात्मक हैं। यह यूज़र्स को यूआई में किसी भी संभावित क्वेरीज़ को फ़िल्टर, एग्रीगेट और ग्रुपिंग के SQL सर्वर पर भेजने की अनुमति देता है (जो निश्चित रूप से, इंडेक्सिंग को कठिन बनाता है)। हां, मैं उन्हें बाद में पुनः प्राप्ति के लिए async मोड सेविंग परिणामों में चलाने के लिए बना सकता हूं, लेकिन लक्ष्य किसी भी क्वेरी को इतनी तेजी से चलाने का है कि परिणाम 2-10 सेकंड के बाद तुरंत उपलब्ध हो और साथ ही विश्लेषणात्मक क्वेरी भी उस वेबसाइट का एकमात्र कार्य हो , मुझे लगता है कि उन्हें async बनाना केवल तभी समझ में आता है जब अन्य प्रश्न हैं जो विश्लेषणात्मक नहीं हैं।
अल्लाव

3

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

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

SQL सर्वर आंतरिक छँटाई या हैश जुड़ने / समुच्चय या स्पूल ऑपरेटरों आदि के लिए tempdb का उपयोग करेगा और आप इस व्यवहार को नियंत्रित नहीं कर सकते। आप जो कर सकते हैं वह वापस आ रहे डेटा की मात्रा को सीमित करता है।

क्या आपने इस बॉक्स पर प्रतीक्षा के आँकड़ों की जाँच की है? हर बार SQL सर्वर किसी संसाधन पर प्रतीक्षा कर रहा है, SQL सर्वर प्रतीक्षा संसाधन को ट्रैक करेगा और उस जानकारी को देखने से मदद मिलती है।

ग्लेन बेरी नैदानिक ​​प्रश्नों को देखें और यह आपके लिए एक अच्छी शुरुआत होगी।

Http://weblogs.sqlteam.com/dang/archive/2009/06/27/Forced-Parameterization-A-Turbo-Button.aspx में उल्लिखित PARAMETERIZATION FORCED को भी देखें


ठीक है, मान लें कि पहले से ही सही अनुक्रमित हैं। मैं यह उल्लेख करना भूल गया कि यह रीड-ओनली क्वेरीज़ वाला केवल-डेटाबेस है और SQl सर्वर बॉक्स पर कोई अन्य एप्लिकेशन नहीं चल रहा है।
अल्लाव

क्या आपके आंकड़े आज तक हैं? रीड-ओनली डेटाबेस आँकड़े नहीं बना सकते यदि वे गायब हैं या पुराने हैं। क्या आपका डेटा तिरछा है या कुंजी के लिए अद्वितीय मान हैं। बहुत सारे कारक हैं जो इस व्यवहार का कारण बन सकते हैं।
शंकर रेड्डी

"इस व्यवहार" से आपका क्या अभिप्राय है? मैंने उल्लेख नहीं किया कि कुछ गलत हो रहा है। मैं सिर्फ अपनी विशेष परिस्थितियों में प्रदर्शन को बढ़ावा देना चाहता हूं। SQL सर्वर किसी भी स्थिति में चलाने के लिए अनुकूलित है, लेकिन यह मेरी स्थिति में सबसे अच्छा तरीका हो सकता है या नहीं भी। मुझे यकीन नहीं है कि मैं संतुलित विकल्प # 1 बनाम # 2 बनाने के लिए SQL सर्वर पर भरोसा कर सकता हूं। जब भी मैं इस पर नया डेटा डालता हूं मैं sp_updatestats चलाता हूं।
अल्लाव

# 1 और # 2 जिस तरह से आप सोच रहे हैं वैसा नहीं होता है। msdn.microsoft.com/en-us/library/ms191475(v=sql.105).aspx msdn.microsoft.com/en-us/library/aa337560(v=sql.105).aspx
शंकर रेड्डी

2
जब आप sp_updatestats चला रहे हैं, तो आपके द्वारा चुना गया नमूना अनुपात क्या है। डिफ़ॉल्ट अनुपात बहुत नमूना है और सूचकांक के आकार पर निर्भर करता है। यदि आपकी क्वेरीज़ नया डेटा (केवल) और फिर भी आप sp_updatestats करते हैं, तो SQL सर्वर निष्पादन योजनाओं पर भगवान के निर्णय नहीं कर सकता है।
शंकर रेड्डी

2

यह प्रश्न वर्तमान में एक समस्या की तलाश में समाधान की तरह पढ़ता है। आपने तय किया है कि एक रैम डिस्क समाधान है और आप चाहते हैं कि कोई व्यक्ति उस विकल्प को मान्य करे। क्षमा करें, होने वाला नहीं है।

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

बेहतर तरीके से समझने के लिए बफ़र प्रबंधन पर एक नज़र डालें कि कैसे SQL सर्वर मेमोरी का प्रबंधन करता है और SQL सर्वर मेमोरी मैनेजमेंट कुछ बुनियादी टूल और DMV प्रश्नों के लिए समझा जाता है कि यह समझने के लिए कि आपकी मेमोरी कहाँ आवंटित की गई है।

मैं सभी कुंवारी एसक्यूएल प्रश्नों का प्रदर्शन कैसे बढ़ा सकता हूं?

यह एक बड़ा विषय है। क्वेरी और योजना पोस्ट करें और आपको लक्षित प्रतिक्रिया मिलेगी।

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