मैं शुरू से कहूंगा कि मेरा प्रश्न / समस्या इस पहले की तरह ही है, लेकिन चूंकि मुझे यकीन नहीं है कि यदि कारण या शुरुआती जानकारी समान है, तो मैंने अपने प्रश्न को कुछ और विवरणों के साथ पोस्ट करने का निर्णय लिया।
मुद्दे पर हाथ:
- एक अजीब घंटे (व्यवसाय के दिन के अंत के पास) एक उत्पादन उदाहरण के लिए गलत व्यवहार करना शुरू कर देता है:
- उदाहरण के लिए उच्च CPU (~ 30% की आधार रेखा से यह लगभग दोगुना हो गया और अभी भी बढ़ रहा है)
- लेनदेन / सेकंड की संख्या में वृद्धि (हालांकि ऐप लोड में कोई बदलाव नहीं हुआ है)
- निष्क्रिय सत्रों की संख्या में वृद्धि
- इस व्यवहार को प्रदर्शित करने वाले सत्रों के बीच अजीब अवरुद्ध घटनाएं (यहां तक कि बिना पढ़े सत्र अवरुद्ध होने का कारण थे)
- अंतराल के लिए शीर्ष प्रतीक्षा 1 स्थान पर गैर पृष्ठ कुंडी थी, जिसमें ताले दूसरे स्थान पर थे
प्रारंभिक जांच:
- sp_whoIsActive का उपयोग करते हुए हमने देखा कि हमारे निगरानी उपकरण द्वारा निष्पादित एक क्वेरी बेहद धीमी गति से चलती है और बहुत सारे सीपीयू हड़पती है, ऐसा कुछ जो पहले नहीं हुआ था;
- इसका अलगाव स्तर बिना पढ़े था;
- हमने उस योजना को देखा जिसे हमने निराला संख्याओं में देखा था: स्टेटमेंटस्ट्रो = "3.86846e + 010" जिसमें अनुमानित 150 टीबी का कुछ डेटा वापस किया जाए।
- हमें संदेह था कि निगरानी उपकरण का एक क्वेरी मॉनिटर फीचर कारण था, इसलिए हमने सुविधा को निष्क्रिय कर दिया (हमने किसी भी मुद्दे के बारे में पता करने के लिए हमारे प्रदाता के साथ एक टिकट खोला है)
- उस पहली घटना से, यह कुछ और बार हुआ, हर बार जब हम सत्र को मारते हैं, तो सब कुछ सामान्य हो जाता है;
- हमें एहसास है कि क्वेरी बीओएल में क्वेरी स्टोर की निगरानी के लिए एमएस द्वारा उपयोग किए गए प्रश्नों में से एक के समान है - प्रश्न जो हाल ही में प्रदर्शन में पुन: प्राप्त हुए (समय में विभिन्न बिंदुओं की तुलना करते हुए)
- हम एक ही क्वेरी को मैन्युअल रूप से चलाते हैं और एक ही व्यवहार देखते हैं (सीपीयू कभी बढ़ रहा है, कुंडी का इंतजार बढ़ रहा है, अप्रत्याशित ताले .. आदि)
दोषी प्रश्न:
Select qt.query_sql_text,
q.query_id,
qt.query_text_id,
rs1.runtime_stats_id AS runtime_stats_id_1,
interval_1 = DateAdd(minute, -(DateDiff(minute, getdate(), getutcdate())), rsi1.start_time),
p1.plan_id AS plan_1,
rs1.avg_duration AS avg_duration_1,
rs2.avg_duration AS avg_duration_2,
p2.plan_id AS plan_2,
interval_2 = DateAdd(minute, -(DateDiff(minute, getdate(), getutcdate())), rsi2.start_time),
rs2.runtime_stats_id AS runtime_stats_id_2
From sys.query_store_query_text AS qt
Inner Join sys.query_store_query AS q
ON qt.query_text_id = q.query_text_id
Inner Join sys.query_store_plan AS p1
ON q.query_id = p1.query_id
Inner Join sys.query_store_runtime_stats AS rs1
ON p1.plan_id = rs1.plan_id
Inner Join sys.query_store_runtime_stats_interval AS rsi1
ON rsi1.runtime_stats_interval_id = rs1.runtime_stats_interval_id
Inner Join sys.query_store_plan AS p2
ON q.query_id = p2.query_id
Inner Join sys.query_store_runtime_stats AS rs2
ON p2.plan_id = rs2.plan_id
Inner Join sys.query_store_runtime_stats_interval AS rsi2
ON rsi2.runtime_stats_interval_id = rs2.runtime_stats_interval_id
Where rsi1.start_time > DATEADD(hour, -48, GETUTCDATE())
AND rsi2.start_time > rsi1.start_time
AND p1.plan_id <> p2.plan_id
AND rs2.avg_duration > rs1.avg_duration * 2
Order By q.query_id, rsi1.start_time, rsi2.start_time
सेटिंग्स और जानकारी:
- Windows Server 2012R2 क्लस्टर पर SQL Server 2016 SP1 CU4 एंटरप्राइज़
- क्वेरी स्टोर डिफ़ॉल्ट के रूप में सक्षम और कॉन्फ़िगर किया गया (कोई सेटिंग नहीं बदली गई)
- डेटाबेस SQL 2005 उदाहरण से आयात किया गया (और अभी भी संगतता स्तर 100 पर)
अनुभवजन्य अवलोकन:
- अत्यंत निराला आँकड़ों के कारण, हमने सभी * plan_persist ** वस्तुओं को बुरी अनुमानित योजना में इस्तेमाल किया (अभी तक कोई वास्तविक योजना नहीं है, क्वेरी कभी समाप्त नहीं हुई) और आँकड़ों की जाँच की, योजना में उपयोग किए गए कुछ इंडेक्स में कोई आँकड़े नहीं थे (DBCC SHOWSTATISTICS ने कुछ भी नहीं लौटाया, sys.stats में से चयन करें कुछ अनुक्रमितों के लिए NULL आँकड़े_डेट () फ़ंक्शन दिखाया
त्वरित और गंदा समाधान:
- क्वेरी स्टोर से संबंधित सिस्टम ऑब्जेक्ट्स पर मैन्युअल रूप से लापता आंकड़े बनाएं या
- नए CE (ट्रेसफ्लैग) का उपयोग करके चलाने के लिए क्वेरी को बाध्य करें - जो आवश्यक आँकड़े भी बनाएगा / अपडेट करेगा
- डेटाबेस की संगतता स्तर को 130 में बदलें (इसलिए यह डिफ़ॉल्ट रूप से नए CE का उपयोग करेगा)
तो, मेरा असली सवाल यह होगा:
क्वेरी स्टोर पर एक क्वेरी पूरे उदाहरण पर प्रदर्शन समस्याओं का कारण क्यों बनेगी? क्या हम क्वेरी स्टोर वाले बग क्षेत्र में हैं?
पुनश्च: मैं कुछ फ़ाइलों (प्रिंट स्क्रीन, IO आँकड़े और योजनाएं) को थोड़े समय में अपलोड करूँगा।
ड्रॉपबॉक्स पर फ़ाइलें जोड़ी गईं ।
योजना 1 - उत्पादन में प्रारंभिक निराला अनुमानित योजना
योजना 2 - वास्तविक योजना, पुरानी CE, एक परीक्षण env में (एक ही व्यवहार, एक ही निराला आँकड़े)
योजना 3 - परीक्षण योजना में वास्तविक योजना, नया सीई