एसक्यूएल सर्वर 2005 मशीनें; क्वेरी एक पर 2sec लेती है, दूसरे पर 15min


12

पर्यावरण:

हमारे पास SQL ​​Server 2005 चलाने वाली दो 32-बिट विंडोज सर्वर 2003 R2 मशीनें हैं। हार्डवेयर कॉन्फ़िगरेशन एक्सोन 5160 सीपीयू, 4 जीबी रैम और 13 जीबी आरओडी0 के समान सर्वर हैं। AWE और / 3GB फ्लैग सक्षम नहीं हैं।

सर्वरों को पूर्वनिर्धारित इंस्टॉलेशन चेकलिस्ट का उपयोग करके साइड-बाय-साइड सेट किया गया था, और सभी स्थापित सॉफ़्टवेयर दोनों मशीनों पर समान हैं।

हर SQL सर्वर इंस्टॉलेशन सेटिंग और पैच लेवल जिसे हम जांचना जानते हैं, समान हैं। एक अंतर यह है कि TEMPDB फास्ट मशीन पर 400MB, और धीमी मशीन पर 1.2GB है। हालाँकि, दोनों ही मामलों में, हमें कोई TEMPDB आवंटन नहीं होता है।

समस्या:

एक संग्रहीत प्रक्रिया है जो एक पर 2 सेकंड में चलती है, लेकिन दूसरे पर 15 मिनट। अतिरिक्त 15 मिनट के दौरान, कोई डिस्क गतिविधि नहीं होती है, कोई मेमोरी उपयोग नहीं बदलता है, लेकिन पूरे समय में एक सीपीयू कोर को 100% पर पिन किया जाता है।

यह व्यवहार तब भी बना रहता है जब डेटाबेस एक से बैकअप और दूसरे से पुनर्स्थापित हो जाता है।

चूंकि यह एक संग्रहीत प्रक्रिया है, इसलिए गतिविधि मॉनिटर और प्रोफाइलर हमें इस बारे में कोई विवरण नहीं दिखाते हैं कि संग्रहीत कार्यविधि में यह उच्च CPU गतिविधि कहां हो रही है।

प्रश्न:

हमें और क्या देखना चाहिए?

ऊपर का पालन करें:

निम्नलिखित कर्सर परिभाषा के लिए FETCH NEXT कथनों में सुस्ती होती है:

DECLARE C CURSOR FOR
    SELECT X, Y
    FROM dbo.A
    WHERE X NOT IN (SELECT X FROM dbo.B)
    AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...

प्रत्येक FETCH स्टेटमेंट - केवल 1000 पंक्तियों वाली एक मेज पर - लगभग 7.25 मिनट की आवश्यकता होती है। (नहीं, मुझे नहीं पता कि यह एक पंक्ति में दो क्यों करता है, डेवलपर्स से पूछने की आवश्यकता है, लेकिन यह दोनों सर्वरों पर सही ढंग से चलता है)।

मुझे इस पर थोड़ा संदेह है कि "NOT IN (SELECT ...)", क्योंकि ऐसा लगता है कि वर्चुअल रीड्स वास्तव में बहुत अधिक है।


Dbo.B में रिकॉर्ड कैसे किया जा सकता है और dbo.BX अनुक्रमित है?
मार्क स्टोरी-स्मिथ

1
अगर आप इसके साथ गए तो प्रदर्शन अंतर होगा, मैं उत्सुक हूं: dbo.ax का चयन करें, dbo.a से dbo.a बायां बाहरी सम्मिलित करें dbo.ax = dbo.bx पर जहां dbo.bxx शून्य है और z <= 0
DForck42

एक और मिश्रण में फेंकने के लिए सोचा। क्या आप निश्चित हैं कि कर्सर की वजह से मंदी है? क्या आप इसे निष्पादन योजना (जो सभी अनुमानों के बारे में) या एक प्रोफ़ाइल ट्रेस से निर्धारित कर रहे हैं?
मार्क स्टोरी-स्मिथ

यह एक प्रोफ़ाइल ट्रेस से है।
रयानडेंकी

क्या निष्पादन योजनाएं समान हैं? यह संभव है कि उनमें से एक खराब निष्पादन योजना का उपयोग कर रहा हो।
ज़ेन

जवाबों:


7

वेट और क्यू जैसे प्रदर्शन समस्या निवारण पद्धति का उपयोग उच्च सीपीयू खपत के कारण की पहचान करता है, फिर अड़चन की पहचान होने पर उचित कार्रवाई की सिफारिश की जा सकती है।


6

SQL सर्वर दूसरे बॉक्स पर एक अलग योजना चुन रहा है।

पुनर्स्थापित करना आमतौर पर आंकड़ों के आधार पर मुद्दों को हटा देगा, इसलिए मैं सर्वर के अंतर को देखूंगा।

कुछ मोटे चेक पहले। मान नहीं: जाँच करें

  • जाँच करें कि SQL सर्वर सेटिंग्स sys.configuration में समान हैं जैसे अधिकतम डिग्री या समानांतरवाद
  • DBCC USEROPTIONS को यह देखने के लिए चलाएं कि क्या कोई ANSI सेटिंग्स रन टाइम में अलग हैं (ANS सेटिंग्स चुनी गई योजना को प्रभावित कर सकती हैं)
  • कोई समस्या है या नहीं यह देखने के लिए Windows और SQL सर्वर लॉग की जाँच करें

फिर रेमस के उत्तर के अनुसार, गहरे सिरे पर कूदें।


संकेत के लिए धन्यवाद। दोनों sys.configurations और DBCC USEROPTIONS दोनों मशीनों के बीच समान हैं। किसी भी विंडोज या SQL सर्वर लॉग में कोई त्रुटि या चेतावनी नहीं है।

1
और वे समान डेटाबेस लेआउट भी चलाते हैं? कोई भी व्यवस्थापक योजनाएँ (सूचकांक पुनर्निर्माण आदि) पर अनुकूलन नहीं कर रहा है, डेटाबेस में प्रासंगिक वस्तुओं और समान डिस्क लेआउट के लिए समान आँकड़े हैं? समान पैच स्तर?
टॉमटॉम

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

6

यदि अन्य सभी चीजें समान हैं, तो यह संभावना है (@ gbn के उत्तर के अनुसार) कि प्रत्येक सर्वर पर एक अलग निष्पादन योजना उत्पन्न हो रही है। एक अकादमिक अभ्यास के रूप में, दोनों योजनाओं को देखना दिलचस्प होगा, इसलिए उन्हें प्रत्येक सर्वर पर योजना कैश से पकड़ो और यदि संभव हो तो उन्हें अपने प्रश्न में जोड़ें। फिर हम उन योजनाओं में अंतरों की पहचान कर सकते हैं जो प्रदर्शन में इतना बड़ा बदलाव ला रहे हैं।

त्वरित सुधार के लिए, USE PLAN संकेत पर एक नज़र डालें । यह धीमी सर्वर पर संग्रहीत प्रक्रिया के लिए, तेज सर्वर से अच्छी योजना को संलग्न करना संभव बनाता है।

संपादित करें: निम्नलिखित अपडेट पुनः: कर्सर

आपकी क्वेरी पर एक अन्य भिन्नता यह आज़माने के लिए कि मुझे अन्य उत्तरों में उल्लेख नहीं दिखता है:

DECLARE C CURSOR FOR
    SELECT X, Y
    FROM dbo.A
    WHERE NOT EXISTS (SELECT 1 FROM dbo.B WHERE dbo.B.X = dbo.A.X)
    AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y

यह अच्छी सलाह है, हम क्वेरी योजनाओं की जांच कर रहे हैं। दरअसल, संग्रहित प्रक्रिया में मंदी एक कर्सर से बंधी हुई लगती है। संपादित देखें।
रयानडेंकी

4

मुझे विनोद करो, और बदलने का प्रयास करो:

DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0

इसके साथ:

DECLARE C CURSOR FOR
SELECT 
    X, 
    Y
FROM dbo.A

    LEFT OUTER JOIN dbo.B
        ON dbo.A.X = dbo.b.X

WHERE dbo.B.X IS NULL
AND Z <=0

मुझे नहीं लगता कि यह आपके कोड के हिस्से से FETCH NEXT FROM में एक प्रदर्शन समस्या के रूप में प्रकट होना चाहिए, लेकिन मैंने अभी तक अपना कैफीन इंजेक्शन नहीं लिया है। मेरे सुझाव को आजमाएँ, और मुझे बताएं।

उम्मीद है की यह मदद करेगा,

मैट


4

अपने अनुक्रमितों की जाँच करें और अपने सभी आँकड़ों को अपडेट करें। मेरे पास एक बहुत ही संकलक मुद्दा था और यह पता चला कि एक मशीन के आँकड़े विस्की थे।


1

मैंने एक ही व्यवहार का दो बार अनुभव किया है और मैं आपको बताऊंगा कि यह हर बार क्या तय होता है:

1.) मैंने स्टोर की गई प्रक्रिया के लिए RECOMPILE के साथ संकेत जोड़ा क्योंकि कैश की गई योजना भयानक थी।

2.) मैंने टेबल चर के बजाय अस्थायी तालिकाओं का उपयोग करने के लिए संग्रहीत प्रक्रिया को बदल दिया।

मुझे आशा है कि दोनों में से कोई भी मदद करेगा। सौभाग्य।

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