SQL Server 2008R2 में ऑटो अपडेट सांख्यिकी: बड़ी संख्या में पंक्ति आवेषण के बावजूद कुछ आँकड़े बासी क्यों रहते हैं?


10

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

इस डेटाबेस में ऑटो अपडेट सांख्यिकी सक्षम है (डिफ़ॉल्ट रूप से)। मैं समझता हूं कि 20% + 500 पंक्ति संशोधनों (अद्यतन / सम्मिलित / हटाए जाने) के आधार पर ऑटो आँकड़े अपडेट के लिए एक सीमा है। यह दहलीज कई अनुक्रमों पर एक बड़ी डिग्री से अधिक हो गई है, ऐसा प्रतीत होता है जैसे या तो (ए) ऑटो अपडेट के साथ एक समस्या है या (बी) अपडेट की रणनीति से अधिक मैं ऑनलाइन में खोजने में सक्षम हूं। प्रलेखन।

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

कुछ अतिरिक्त नोट:

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

2) एक परीक्षण स्क्रिप्ट के साथ इस मुद्दे को फिर से बनाने की कोशिश में जिसमें INSERT, SELECT और DELETE सम्‍मिलित हैं, जो होने वाली समस्‍या को हल करता है। मैं सोच रहा था कि यहाँ क्या अंतर है कि ये कथन प्रत्येक SQL कथन की कई पंक्तियों को प्रभावित करते हैं, जबकि हमारी लोड टेस्ट स्क्रिप्ट व्यक्तिगत रूप से पंक्तियों को सम्मिलित करने की प्रवृत्ति होगी।

3) प्रश्न में DB 'सरल' रिकवरी मॉडल पर सेट है।

कुछ प्रासंगिक लिंक:

मैंने इस मुद्दे को Microsoft कनेक्ट के माध्यम से भी उठाया है:

अद्यतन 2011-06-30:

आगे की जांच पर मेरा मानना ​​है कि थ्रेसहोल्ड के स्तर (जैसे 500 पंक्तियाँ + 20%) से बाहर की तारीख के आँकड़े आँकड़े हैं, जो समस्या क्वेरी द्वारा उपयोग नहीं किए जा रहे हैं, इसलिए संभवतः किसी क्वेरी के चलने पर उन्हें अपडेट किया जाएगा। उनकी आवश्यकता है। आँकड़े है कि के लिए कर रहे हैं क्वेरी द्वारा प्रयोग किया जाता है, इन नियमित रूप से अपडेट किया जा रहा है। तब शेष मुद्दा यह है कि ये आँकड़े केवल कुछ अपेक्षाकृत आवेषण के बाद क्वेरी प्लान ऑप्टिमाइज़र को भ्रामक रूप से गुमराह कर रहे हैं (उदाहरण के लिए 9 मिलियन या इससे अधिक अनुमानित संख्या 1 थी)।

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

अद्यतन 2012-01-10:

विचार करने के लिए एक और कारक। पुरानी और / या भ्रामक सांख्यिकी की घटना से संबंधित विशिष्ट कमियों को दूर करने के लिए SQL सर्वर 2005 में दो ट्रेस झंडे जोड़े गए (और 2008 में अभी भी मौजूद हैं)। प्रश्न में झंडे हैं:

DBCC TRACEON(2389)
DBCC TRACEON(2390)

MSDN: इयान जोस का वेबलॉग: आरोही कुंजी और ऑटो त्वरित सुधार सांख्यिकी , बढ़ते कॉलम, फैबियानो अमोरिम

इन झंडों को सक्षम करने का निर्णय लेते समय आपको निश्चित रूप से बहुत सावधान रहना चाहिए क्योंकि उनके हानिकारक प्रभाव हो सकते हैं।

जवाबों:


8

कुछ जानकारी, अगर एक निश्चित जवाब नहीं है

यह हाल ही में ब्लॉग किया गया है

एक श्वेतपत्र भी है। "SQL Server 2008 में सांख्यिकी को बनाए रखना" अनुभाग देखें जहां कुछ स्थितियां हैं जो आपको प्रभावित करती हैं। उदाहरण:

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

अंत में जाँच करने के लिए कुछ सेटिंग्स भी हैं: क्या होगा यदि डीबी स्तर पर ऑफ जो सूचकांक / स्टेट स्तर पर एक से अधिक हो?

HTH ...

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