SQL सर्वर प्रदर्शन अचानक गिरावट


13

मेरे पास एक SQL सर्वर 2005 है जो देर से अप्रत्याशित हो गया है, और मैं अपना सिर खरोंच कर रहा हूं क्यों। चंद सेकंड में निष्पादित की जाने वाली योजनाएं बदल रही हैं और मिनट लग रहे हैं (पूर्ण तालिका स्कैन या सूचकांक स्पूल में समय लग रहा है)। अब पहली और सबसे स्पष्ट बात यह है कि आँकड़े अप्रचलित हैं जिससे ऑप्टिमाइज़र भ्रमित हो जाता है, लेकिन मुझे विश्वास है कि ऐसा नहीं है - सबसे पहले क्योंकि अंतर्निहित डेटा में महत्वपूर्ण रूप से परिवर्तन नहीं हो रहा है (जैसे एक वर्ष के डेटा का एक दिन का डेटा जोड़ना पहले से ही एक तालिका में) और दूसरी बात यह है कि ऑटो क्रिएट स्टैटिस्टिक्स और ऑटो अपडेट स्टैटिस्टिक्स दोनों सत्य हैं। हालांकि अनुकूलक है भ्रमित हो रही है; ट्यूनिंग सलाहकार में एसक्यूएल चलाने से मुझे बहुत सारे मल्टी-कॉलम CREATE STATISTICSस्टेटमेंट मिलते हैं जो इसे ठीक करने के लिए प्रतीत होते हैं (अगले एसक्यूएल दुर्व्यवहारों तक)।

एक रणनीति के किसी भी विचार का उपयोग मैं यह करने के लिए कर सकता हूं? कोई भी "सामान्य" आँकड़े पर्याप्त क्यों नहीं हैं?

जवाबों:


8

यदि आपका शीर्ष प्रतीक्षा SOS_SCHEDULER_YIELD है, तो ऐसा प्रतीत होता है कि आपके पास CPU पर कुछ दबाव है। लेकिन यह कुछ और का परिणाम हो सकता है, जैसे कि आपका डिज़ाइन अब आपके प्रश्नों के लिए पर्याप्त नहीं है। मुझे पता है कि आपने कहा था कि आप केवल एक दिन के डेटा को जोड़ रहे हैं, लेकिन आप एक टिपिंग पॉइंट मार सकते हैं।

आपके प्रश्न कैसे जारी किए जा रहे हैं? क्या यह गतिशील एसक्यूएल है? क्या आप संग्रहीत प्रक्रियाओं का उपयोग कर रहे हैं? क्या आप sp_executesql का उपयोग कर रहे हैं? क्या यह संभव है कि आपके पास पैरामीटर सूँघने का मामला है? आपका डीबी डिजाइन कैसा दिखता है? पीके और एफके रिश्ते क्या हैं?

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

क्या आप किसी अच्छी योजना के खराब होने का उदाहरण दे सकते हैं?

अंत में, एडम मैकहानिक से sp_whoIsActive ( http://whoisactive.com/ ) की एक प्रति ले लो और चल रहे प्रश्नों के बारे में अधिक निर्धारित करने के लिए इसका उपयोग करें। और अगर आप sp_whoIsActive से आउटपुट कैप्चर करना चाहते हैं, तो यहां जाएं http://www.littlekendra.com/2011/02/01/whoisactive/


यह एक तृतीय पक्ष अनुप्रयोग है, इसका स्कीमा या एसक्यूएल पर मेरा कोई नियंत्रण नहीं है, जो बहुत ही भयानक है, बहुत सारे पैरामीटरयुक्त प्रश्न (जैसे where col=(cast @var...)) और @varहो सकते हैं '%'। मुझे सिर्फ एक या दो सप्ताह पहले यह विरासत में मिला है, और इसे तब तक मूल रूप से काम करने की आवश्यकता है जब तक इसे प्रतिस्थापित नहीं किया जाता है। लिंक के लिए धन्यवाद, मैं इसे एक चक्कर दूंगा।
गियुस

अगली सबसे बड़ी प्रतीक्षा इसके बाद की SOS_SCHEDULER_YIELDथी CXPACKETऔर sp_configure "max degree of parallelism", 1अब तक के लिए - दोनों समस्याओं को सिर पर रख लिया। धन्यवाद!
गयूस

+1 sp_whoIsActive के लिंक के लिए
Jeff

8

से MSDN :

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

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

रखरखाव संचालन के बाद, डेटा के वितरण को बदलने वाली रखरखाव प्रक्रियाओं को करने के बाद आंकड़ों को अपडेट करने पर विचार करें, जैसे कि तालिका को छोटा करना या बड़ी प्रतिशत पंक्तियों का बल्क इंसर्ट करना। यह क्वेरी प्रोसेसिंग में भविष्य की देरी से बच सकता है जबकि प्रश्न स्वचालित सांख्यिकी अपडेट की प्रतीक्षा करते हैं। "

आप अपने सिस्टम पर समय-समय पर "EXEC sp_updatestats" का उपयोग कर सकते हैं (कुछ समय निर्धारित करें) या सभी वस्तुओं पर फ़ंक्शन STATS_DATE का उपयोग करें और देखें कि उनके आँकड़े वास्तव में पिछली बार कब अपडेट किए गए थे और यदि तब से बहुत अधिक था, तो UPDATE का उपयोग करें उस विशेष वस्तु के लिए सांख्यिकी। मेरे अनुभव में, यहां तक ​​कि स्वचालित आंकड़ों के सक्षम होने के बावजूद, हम अभी भी समय-समय पर आँकड़े अपडेट करने के लिए मजबूर होते हैं, क्योंकि उन कार्यों के कारण जो स्वचालित अपडेट को ट्रिगर नहीं करते थे।

मेरे व्यक्तिगत कोड को जोड़ने के लिए (साप्ताहिक नौकरी में इस्तेमाल किया जाता है जो आंकड़े अपडेट के लिए गतिशील बयान बनाता है):

select distinct
        'update statistics [' + stats.SchemaName + '].[' + stats.TableName + ']'
            + case when stats.RowCnt > 50000 then ' with sample 30 percent;'
            else 
                ';' end
        as UpdateStatement
    from (
        select
            ss.name SchemaName,
            so.name TableName,
            so.id ObjectId,
            st.name AS StatsName, 
            STATS_DATE(st.object_id, st.stats_id) AS LastStatisticsUpdateDate
            , si.RowModCtr
            , (select case si2.RowCnt when 0 then 1 else si2.RowCnt end from sysindexes si2 where si2.id = si.id and si2.indid in (0,1)) RowCnt
        from sys.stats st
            join sysindexes si on st.object_id = si.id and st.stats_id = si.indid
            join sysobjects so on so.id = si.id and so.xtype = 'U' --user table
            join sys.schemas ss on ss.schema_id = so.uid
    ) stats
    where cast(stats.RowModCtr as float)/cast(stats.RowCnt as FLOAT)*100 >= 10 --more than 10% of the rows have changed
    or ( --update statistics that were not updated for more than 3 months (and rows no > 0)
        datediff(month, stats.LastStatisticsUpdateDate, getdate()) >= 3
        and stats.RowCnt > 0
    )

यहां मुझे वे सभी ऑब्जेक्ट मिलते हैं जहां 3 से अधिक महीनों के लिए अपडेट नहीं किए गए थे या पिछले आंकड़ों के अपडेट के बाद इसमें 10% से अधिक पंक्तियां थीं।


हम्म, मेरी शीर्ष प्रतीक्षा घटना है, SOS_SCHEDULER_YIELDलेकिन मैं अभी नहीं बता सकता कि अगर यह खराब योजनाओं के कारण है, या कि यह (6-वर्षीय, 2-प्रोसेसर, 4 जी रैम) बॉक्स वास्तव में अभी ओवरलोड है और मैं कुछ ढोने वाले बिंदु पर चला गया।
गयुस

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

@ डेविड: यह वही है जो मैं साप्ताहिक नौकरी में कर रहा हूँ :)। मैंने अभी Gaius को उस आउटपुट को देखने के लिए अलग रूप में स्वरूपित किया है जिसका मैं उपयोग कर रहा हूं। प्रारंभिक स्क्रिप्ट रास्ता बहुत बदसूरत और लंबा था। स्वरूपण के साथ मदद के लिए धन्यवाद! क्या आप मुझे एक फ़ॉर्मेटिंग ट्यूटोरियल में भेज सकते हैं..क्योंकि मुझे वास्तव में पता नहीं है कि यहाँ कोड को अच्छा कैसे बनाया जाए। धन्यवाद!
मैरियन

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

3
ऑटो अपडेट आँकड़े वास्तव में 20% + 500 पंक्तियों पर ट्रिगर होते हैं, 10% नहीं।
मर्देनी

3

मेरा अनुमान है कि आपकी एक या एक से अधिक टेबल इतनी बड़ी हो रही हैं कि वे 20% बदलावों को रोकने में मदद नहीं कर रही हैं ताकि मौजूदा आंकड़ों को बासी होने में मदद मिल सके ताकि ऑटो अपडेट सांख्यिकी में किक हो जाए और फिर भी पर्याप्त अपडेट (या आवेषण) मिलें ) कि अद्यतन आँकड़े होने से बहुत मदद मिलेगी। मुझे हाल ही में SQL 2000 से SQL 2008 में अपग्रेड करने के बाद एक विशेष वातावरण में एक ही चीज़ मिली।

उपरोक्त उत्तर में वर्णित अन्य साइटों के अलावा, मैं निम्नलिखित ऑनलाइन संसाधनों की जाँच करने का सुझाव दूंगा।

1) Red-Gate में कई मुफ्त ई-बुक्स उपलब्ध हैं जिनमें होल्गर शिलिंग द्वारा "SQL सर्वर स्टेटिस्टिक्स" शामिल है, जहां आपको निम्नलिखित उद्धरण मिलेगा:

http://www.red-gate.com/our-company/about/book-store/

"किसी भी लिंक किए गए आँकड़ों को अमान्य करने के लिए स्तंभ के डेटा के कम से कम 20% से अधिक तालिकाओं को बदलना पड़ा"

2) SQL संतरी में एक नि: शुल्क योजना एक्सप्लोरर उपकरण होता है जो किसी SQL योजना में समस्याओं को ट्रैक करने में मदद करता है, जैसे किसी क्वेरी में दिए गए टेबल के लिए वास्तविक संख्या के साथ बहुत अधिक या बहुत कम पंक्तियों का अनुमान। बस SSMS से वास्तविक निष्पादन योजना को बचाएं और फिर प्लान एक्सप्लोरर का उपयोग करके योजना के विभिन्न हिस्सों से चलें। ऐसा नहीं है कि ग्राफिक निष्पादन योजना का उपयोग करके एसएसएमएस में जानकारी उपलब्ध नहीं है, लेकिन एसक्यूएल संतरी के उपकरण से इसे देखना बहुत आसान हो जाता है।

http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp

3) स्टैटस अपडेट की तारीखों की जाँच करें अपने आप को उन प्रश्नों में तालिकाओं के लिए, जिन्हें आप STATS_DATE () का उपयोग करने में सबसे अधिक रुचि रखते हैं, आप निम्नलिखित चर्चा में पाए गए क्वेरी का उपयोग करके सबसे पुराने आँकड़े प्राप्त करने के लिए एक त्वरित क्वेरी पा सकते हैं।

http://blog.sqlauthority.com/2010/01/25/sql-server-find-statistics-update-date-update-statistics/

आशा है कि ये आपकी मदद करेगा!

मुझे लगता है कि आप विशेष रूप से रेड-गेट से पुस्तक का आनंद लेंगे!

जेफ


धन्यवाद, मैं उनके माध्यम से अपना काम करूँगा। मैं मुख्य रूप से एक ओरेकल डीबीए हूं, जो इस प्रणाली को विरासत में मिला है (थियो 'मैं SQL सर्वर के खिलाफ बिल्कुल भी पूर्वाग्रह से ग्रस्त नहीं हूं, जो मैं 2005 से देख रहा हूं यह एक बहुत ही सक्षम मंच है, मैं इसे सिर्फ उतना ही नहीं जानता जितना मैं ओरेकल को जानता हूं) ।
गियुस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.