पर्यावरण:
हमारे पास 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 ...)", क्योंकि ऐसा लगता है कि वर्चुअल रीड्स वास्तव में बहुत अधिक है।