हालांकि, मैं @ थोमस की तरह, "प्रति-डेटाबेस सीपीयू उपयोग" की चिंताओं के बारे में टिप्पणी पर पूरी तरह से @Aaron से सहमत हूं, या तो सटीक या उपयोगी है, मैं कम से कम इस सवाल का जवाब दे सकता हूं कि उन दो प्रश्नों में ऐसा क्यों है विभिन्न। और इसका कारण यह है कि वे अलग-अलग इंगित करेंगे कि कौन सा अधिक सटीक है, हालांकि उच्च स्तर की सटीकता अभी भी उस व्यक्ति के सापेक्ष है जो विशेष रूप से गलत है, इसलिए अभी भी वास्तव में सटीक नहीं है ;-)।
CPU जानकारी (यानी ) प्राप्त करने के लिए पहली क्वेरी sysinos_exec_query_stats का उपयोग करती है total_worker_time
। यदि आप उस डीएमवी के लिए MSDN प्रलेखन से जुड़े हुए पृष्ठ पर जाते हैं, तो आपको एक छोटा, 3 वाक्य परिचय और उन वाक्यों में से 2 हमें इस जानकारी के संदर्भ ("यह कितना विश्वसनीय है) को समझने की आवश्यकता है।" और "यह कैसे तुलना करता है sys.sysprocesses
")। वे दो वाक्य हैं:
SQL सर्वर में कैश्ड क्वेरी योजनाओं के लिए कुल प्रदर्शन आंकड़े देता है। ... जब कोई योजना कैश से निकाल दी जाती है, तो इसी पंक्तियों को इस दृश्य से हटा दिया जाता है
पहला वाक्य, " कुल प्रदर्शन के आंकड़े लौटाता है ", हमें बताता है कि इस DMV में जानकारी (कई अन्य लोगों की तरह) संचयी है और केवल उन प्रश्नों के लिए विशिष्ट नहीं है जो वर्तमान में चल रहे हैं। यह उस DMV में एक फ़ील्ड द्वारा इंगित किया गया है जो प्रश्न में क्वेरी का हिस्सा नहीं है execution_count
, जो फिर से दिखाता है कि यह संचयी डेटा है। और इस डेटा को संचयी होना काफी आसान है क्योंकि आप कुछ मैट्रिक्स को विभाजित करके औसत, आदि प्राप्त कर सकते हैं execution_count
।
दूसरा वाक्य, "कैश से निकाले जा रहे प्लान भी इस डीएमवी से हटा दिए जाते हैं", यह इंगित करें कि यह पूरी तरह से एक पूरी तस्वीर नहीं है, खासकर यदि सर्वर में पहले से ही पूरी योजना कैश है और लोड के तहत है और इसलिए योजनाओं को समाप्त कर रहा है कुछ हद तक। इसके अलावा, अधिकांश डीएमवी को रीसेट किया जाता है जब सर्वर रीसेट करता है तो वे एक सच्चे इतिहास नहीं होते हैं भले ही ये पंक्तियों को योजना समाप्त होने पर हटाया नहीं गया था।
अब इसके साथ उपरोक्त विपरीत करते हैं sys.sysprocesses
। यह सिस्टम दृश्य केवल वही दिखा रहा है जो वर्तमान में चल रहा है, बस sysinos_exec_connections , sysinos_exec_session , और sysinos_exec_requests (जो लिंक किए गए पृष्ठ पर कहा गया है sys.dm_exec_sessions
) के संयोजन की तरह । यह sys.dm_exec_query_stats
DMV की तुलना में सर्वर का एक बिल्कुल अलग दृष्टिकोण है जो प्रक्रिया पूरी होने के बाद भी डेटा को धारण करता है। मतलब, "दूसरी क्वेरी से परिणाम गलत हैं?" सवाल, वे गलत नहीं हैं, वे प्रदर्शन आँकड़ों के एक अलग पहलू (यानी समय-सीमा) से संबंधित हैं।
तो, क्वेरी का उपयोग sys.sysprocesses
केवल "अभी देख रहा है"। और का उपयोग कर क्वेरी sys.dm_exec_query_stats
में दिख रही है ज्यादातर (शायद) क्या एसक्यूएल सर्वर सेवा (या स्पष्ट रूप से सिस्टम रिबूट) के अंतिम पुनः आरंभ करने के बाद से नहीं हुआ है। सामान्य प्रदर्शन विश्लेषण के लिए ऐसा लगता है कि sys.dm_exec_query_stats
यह कहीं बेहतर है, लेकिन फिर से, यह उपयोगी जानकारी को हर समय छोड़ देता है। और, दोनों ही मामलों में, आपको पहली बार में "database_id" मान की सटीकता के संबंध में प्रश्न टिप्पणियों (@ हटाए गए) में @Aaron द्वारा बनाए गए बिंदुओं पर भी विचार करने की आवश्यकता है (यानी यह केवल सक्रिय DB को दर्शाता है जिसने कोड शुरू किया था जरूरी नहीं कि जहां "मुद्दा" हो रहा हो)।
लेकिन, यदि आप केवल जरूरत है / क्या अभी सभी डेटाबेस भर में हो रहा है की भावना प्राप्त करना चाहते हैं, संभवतः क्योंकि चीजों को धीमा कर रहे हैं अभी, आप के संयोजन का उपयोग कर बेहतर होगा sys.dm_exec_connections
, sys.dm_exec_sessions
और sys.dm_exec_requests
(और नहीं पदावनत sys.sysprocesses
)। बस ध्यान रखें कि आप प्रश्नों के लिए देख रहे हैं , डेटाबेस के लिए नहीं , क्योंकि प्रश्न कई डेटाबेस में शामिल हो सकते हैं, एक या अधिक डेटाबेस से यूडीएफ शामिल कर सकते हैं, आदि।
संपादित करें:
यदि समग्र चिंता उच्च सीपीयू उपभोक्ताओं को कम कर रही है, तो उन प्रश्नों की तलाश करें जो सबसे अधिक सीपीयू उठा रहे हैं, क्योंकि डेटाबेस वास्तव में सीपीयू नहीं लेते हैं (प्रति डेटाबेस को देखते हुए एक होस्टिंग कंपनी में काम कर सकते हैं जहां प्रत्येक डेटाबेस को अलग किया जाता है और एक अलग ग्राहक के स्वामित्व में)।
निम्न क्वेरी उच्च औसत CPU उपयोग के साथ प्रश्नों की पहचान करने में मदद करेगी। यह क्वेरी_स्टेट्स DMV में डेटा को सम्मिलित करता है क्योंकि ये रिकॉर्ड एक ही क्वेरी (हाँ, क्वेरी बैच का एक ही सबसेट) दिखा सकते हैं, प्रत्येक बार एक अलग निष्पादन योजना के साथ।
;WITH cte AS
(
SELECT stat.[sql_handle],
stat.statement_start_offset,
stat.statement_end_offset,
COUNT(*) AS [NumExecutionPlans],
SUM(stat.execution_count) AS [TotalExecutions],
((SUM(stat.total_logical_reads) * 1.0) / SUM(stat.execution_count)) AS [AvgLogicalReads],
((SUM(stat.total_worker_time) * 1.0) / SUM(stat.execution_count)) AS [AvgCPU]
FROM sys.dm_exec_query_stats stat
GROUP BY stat.[sql_handle], stat.statement_start_offset, stat.statement_end_offset
)
SELECT CONVERT(DECIMAL(15, 5), cte.AvgCPU) AS [AvgCPU],
CONVERT(DECIMAL(15, 5), cte.AvgLogicalReads) AS [AvgLogicalReads],
cte.NumExecutionPlans,
cte.TotalExecutions,
DB_NAME(txt.[dbid]) AS [DatabaseName],
OBJECT_NAME(txt.objectid, txt.[dbid]) AS [ObjectName],
SUBSTRING(txt.[text], (cte.statement_start_offset / 2) + 1,
(
(CASE cte.statement_end_offset
WHEN -1 THEN DATALENGTH(txt.[text])
ELSE cte.statement_end_offset
END - cte.statement_start_offset) / 2
) + 1
)
FROM cte
CROSS APPLY sys.dm_exec_sql_text(cte.[sql_handle]) txt
ORDER BY cte.AvgCPU DESC;
AvgCPU
मिलीसेकेंड में?