Microsoft SQL सर्वर के भीतर की सभी पुरानी क्वेरी योजनाओं को आप कैसे साफ़ करते हैं?


12

हमारे पास Microsoft SQL डेटाबेस का उपयोग करने वाले शेल्फ अनुप्रयोग बंद है। इस एप्लिकेशन के भीतर हम प्रत्येक रिपोर्ट के लिए विभिन्न चयन मानदंड चुनते और चुनते हैं। यह एप्लिकेशन तब इन रिपोर्टों को चलाता है।

मेरा मानना ​​है कि हमारे पास एक क्वेरी योजना का मुद्दा है। प्रत्येक दिन हम जो पहली रिपोर्ट चलाते हैं, वह बहुत तेजी से 7 मिनट चलती है। पहली रिपोर्ट में एक घंटे से अधिक समय लगने के बाद हम जो भी रिपोर्ट चलाते हैं।

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

क्या SQL Server में वर्तमान में मौजूद सभी क्वेरी योजनाओं को खाली करने का कोई तरीका है?

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


जवाबों:


7

मेरे पिछले उत्तर के लिए मेरी क्षमायाचना।

1) अगर आप जानते हैं कि आपकी क्वेरी हर बार संग्रहीत कार्यविधि से चलने पर अलग-अलग होगी, तो सृजित प्रक्रिया विवरण के साथ RIPPILE विकल्प जोड़ें। RECOMPILE विकल्प के साथ संग्रहीत कार्यविधि निष्पादन योजना का पुन: उपयोग करने से रोकता है, इसलिए SQL सर्वर इस प्रक्रिया के लिए एक योजना को कैश नहीं करता है और प्रक्रिया को रन टाइम पर फिर से शुरू किया जाता है। यदि आपके क्वेरी को संग्रहीत कार्यविधि से चलाया जाता है तो हर बार अलग-अलग होने पर RECOMPILE विकल्प का उपयोग करने से प्रदर्शन को बढ़ावा मिल सकता है क्योंकि इस मामले में गलत निष्पादन योजना का उपयोग नहीं किया जाएगा।

2) आपको एक प्लान गाइड बनाना होगा जो निष्पादन योजना को लागू करने के लिए हर प्रकार के क्वेरी (हर संग्रहीत प्रक्रिया अनुरोध प्रकार) के लिए एक USE PLAN क्वेरी संकेत का उपयोग करता है

यहां निष्पादन योजना के बारे में लेख है जो मदद कर सकता है।


मैं RECOMPILE के साथ उपयोग करने से सहमत हूं, मैंने यह उन प्रणालियों के साथ किया है जिन्हें मैंने बनाया है। हालाँकि, मेरे पास sql स्रोत तक पहुंच नहीं है ... यह एक एप्लिकेशन के भीतर से चलता है।
माइकल रिले - AKA Gunny

इस मामले में @Cape कॉड गनी DBCC FLUSHPROCINDB आज़माएं: SQL सर्वर पर विशिष्ट डेटाबेस के लिए संग्रहीत कार्यविधि कैश को साफ़ करने के लिए उपयोग किया जाता है, न कि संपूर्ण SQL सर्वर पर। आप यह सुनिश्चित करने के लिए परीक्षण से पहले इस आदेश का उपयोग करना चाहते हैं कि पिछली संग्रहीत कार्यविधि योजना परीक्षण परिणामों को नकारात्मक रूप से प्रभावित नहीं करेगी। उदाहरण: DECLARE @intDBID INTEGER SET @intDBID = (SELECT dbid from master.dbo.sysdat डेटाबेस WHERE नाम = 'database_name') DBCC FLUSHPROCINDB (@intDBID)
garik

समस्या हल हो गई है। यह पता चला है कि खोज मानदंडों को संग्रहीत करने के लिए उपयोग की जाने वाली एक अस्थायी तालिका में डेटा का लगातार संचय किया गया था। डेटा एकत्र करने से पहले प्रक्रिया को इस तालिका से डेटा को अलग करना है। अच्छा एसक्यूएल स्निपेट के लिए धन्यवाद।
माइकल रिले - AKA Gunny

13

आपने यहां दो प्रश्न पूछे। सबसे पहले, आप यह जानना चाहते हैं कि क्या आप SQL की आवृत्ति के लिए मेमोरी में संग्रहीत सभी योजनाओं को हटा सकते हैं। जैसा कि मैट एम ने सुझाव दिया था कि DBCC FREEPROCCACHE के साथ किया जाता है।

दूसरा प्रश्न जो आपने पूछा है, "मैं 30 या इतने उपयोगकर्ताओं को प्रभावित किए बिना यह कैसे कर सकता हूं जो एक ही सर्वर पर अन्य डेटाबेस पर भरोसा करते हैं?"। संक्षिप्त उत्तर "आप नहीं कर सकते हैं"। यदि आप उन अन्य उपयोगकर्ताओं की तुलना में सभी योजनाओं को हटा देते हैं जो स्मृति में होने वाली योजनाओं पर निर्भर हैं, तो संभवतः प्रदर्शन हिट हो जाएगा।

इसके लिए वर्कअराउंड में कुछ मैनुअल हस्तक्षेप की आवश्यकता होती है। आप विशिष्ट योजनाओं को हटाने के लिए DBCC FREEPROCCACHE का उपयोग कर सकते हैं बशर्ते कि आपके पास plan_handle हो।

ऊपर आप जो वर्णन कर रहे हैं, वह योजना के मुद्दे की तरह लगता है, लेकिन मैं निश्चित नहीं हूं कि योजनाओं को हटाना ही उत्तर है। योजनाओं को हटाने के बारे में सोचने से पहले मैं आपको सूँघने की दिशा में संकेत करूँगा:

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx

आपको एक निर्धारित आधार पर DBCC FREEPROCCACHE के साथ बेवकूफ बनाने के बजाय प्रश्नों को अनुकूलित करने में सक्षम होना चाहिए। मैं यह भी सलाह दूंगा कि आप अपने उदाहरण के लिए प्रतीक्षा की घटनाओं का विश्लेषण करने में समय व्यतीत करें।


DBCC FREEPROCCACHE ने समस्या हल नहीं की। मैं गतिविधि और घटनाओं का मौद्रिक कार्य करता हूं। 0 शारीरिक I / O हैं। यह इस एप्लिकेशन पर लटका हुआ लगता है: .net Sql क्लाइंट डेटा प्रोवाइडर। प्रतीक्षा प्रकार CXPACKET है।
माइकल रिले - AKA Gunny

CXPACKET का अर्थ है कि आपकी क्वेरी समानांतर चल रही है। क्या आप पता लगा सकते हैं कि क्वेरी के लिए कितने थ्रेड चल रहे हैं, और उनके वेट की जांच करें? आप एडम मैकेनिक के मुफ्त टूल WhoIsActive sqlblog.com/files/folders/release/entry29675.aspx का उपयोग करना चाह सकते हैं ।
21 अप्रैल को SQLRockstar

7

DBCC FREEPROCCACHE

इस आदेश का उपयोग करके, आप पूरी प्रक्रिया कैश को एक एकल आदेश तक खाली कर सकते हैं। निश्चित रूप से इस कमांड का उपयोग करने से पहले प्रलेखन पढ़ें। रिमार्क्स सेक्शन को कुछ बार पढ़ें।

प्रक्रिया कैश को साफ़ करने से संग्रहित प्रक्रिया कैश अगले उपयोग पर फिर से शुरू हो जाएगा। यह प्रदर्शन को प्रभावित कर सकता है। सावधानी से प्रयोग करें!

मैट


मैंने DBCC FREEPROCCACHE का उपयोग करने की कोशिश की और इसने समस्या का समाधान नहीं किया। मैंने 1 घंटे के बाद इस प्रक्रिया को मार डाला।
माइकल रिले - AKA Gunny
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.