डिफ़ॉल्ट विस्तारित ईवेंट सत्र से गतिरोध घटनाओं को खींचने के लिए क्वेरी को यहां से निष्पादित करना
SELECT CAST (
REPLACE (
REPLACE (
XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'),
'<victim-list>', '<deadlock><victim-list>'),
'<process-list>', '</victim-list><process-list>')
AS XML) AS DeadlockGraph
FROM (SELECT CAST (target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets st
JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address
WHERE [name] = 'system_health') AS Data
CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
WHERE XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report';
मेरी मशीन पर पूरा होने में लगभग 20 मिनट लगते हैं। बताए गए आंकड़े हैं
Table 'Worktable'. Scan count 0, logical reads 68121, physical reads 0, read-ahead reads 0,
lob logical reads 25674576, lob physical reads 0, lob read-ahead reads 4332386.
SQL Server Execution Times:
CPU time = 1241269 ms, elapsed time = 1244082 ms.
यदि मैं WHERE
क्लॉज को हटाता हूं तो यह एक दूसरी रिटर्निंग 3,782 पंक्तियों से कम में पूरा होता है।
इसी तरह अगर मैं OPTION (MAXDOP 1)
मूल क्वेरी में जोड़ता हूं जो चीजों को गति देता है तो अब आँकड़े बहुत कम लोब पढ़ता है।
Table 'Worktable'. Scan count 0, logical reads 15, physical reads 0, read-ahead reads 0,
lob logical reads 6767, lob physical reads 0, lob read-ahead reads 6076.
SQL Server Execution Times:
CPU time = 639 ms, elapsed time = 693 ms.
तो मेरा सवाल है
क्या कोई समझा सकता है कि क्या चल रहा है? मूल योजना इतनी भयावह क्यों है और समस्या से बचने का कोई विश्वसनीय तरीका है?
इसके अलावा:
मैंने यह भी पाया है कि INNER HASH JOIN
चीजों को कुछ हद तक सुधारने के लिए क्वेरी को बदलना (लेकिन इसमें अभी भी> 3 मिनट लगते हैं) क्योंकि DMV के परिणाम इतने छोटे हैं कि मुझे संदेह है कि ज्वाइन प्रकार स्वयं ही जिम्मेदार है और मान लें कि कुछ और बदल गया है। उसके लिए आँकड़े
Table 'Worktable'. Scan count 0, logical reads 30294, physical reads 0, read-ahead reads 0,
lob logical reads 10741863, lob physical reads 0, lob read-ahead reads 4361042.
SQL Server Execution Times:
CPU time = 200914 ms, elapsed time = 203614 ms.
विस्तारित घटनाओं को भरने के बाद रिंग बफर ( 4,880,045 बाइट्स DATALENGTH
में से XML
था और इसमें 1,448 इवेंट थे।) और MAXDOP
संकेत के बिना मूल क्वेरी के कट डाउन संस्करण का परीक्षण करना ।
SELECT COUNT(*)
FROM (SELECT CAST (target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets st
JOIN sys.dm_xe_sessions s
ON s.address = st.event_session_address
WHERE [name] = 'system_health') AS Data
CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent)
WHERE XEventData.XEvent.value('@name', 'varchar(4000)') = 'xml_deadlock_report'
SELECT*
FROM sys.dm_db_task_space_usage
WHERE session_id = @@SPID
निम्नलिखित परिणाम दिए
+-------------------------------------+------+----------+
| | Fast | Slow |
+-------------------------------------+------+----------+
| internal_objects_alloc_page_count | 616 | 1761272 |
| internal_objects_dealloc_page_count | 616 | 1761272 |
| elapsed time (ms) | 428 | 398481 |
| lob logical reads | 8390 | 12784196 |
+-------------------------------------+------+----------+
तेजी से दिखाई देने वाले 616
पृष्ठों के आवंटन और डील-डौल के साथ टेम्पर्ड आवंटन में स्पष्ट अंतर है। यह उसी तरह के पृष्ठों का उपयोग होता है जब XML को एक चर में भी रखा जाता है।
धीमी योजना के लिए ये पृष्ठ आवंटन संख्या लाखों में हैं। मतदान dm_db_task_space_usage
चल रहा है जबकि क्वेरी से पता चलता है कि यह tempdb
किसी भी समय आवंटित किए गए 1,800 और 3,000 पृष्ठों के बीच कहीं भी लगातार पृष्ठों का आवंटन और डीलिंग कर रहा है ।
WHERE
खंड को XQuery अभिव्यक्ति में स्थानांतरित कर सकते हैं ; तर्क को तेजी से जाने के लिए इसे हटाया नहीं जाना चाहिएTargetData.nodes ('RingBufferTarget[1]/event[@name = "xml_deadlock_report"]')
:। उस व्यक्ति ने कहा, मुझे नहीं पता कि आपने जो सवाल किया है, उसका जवाब देने के लिए एक्सएमएल इंटर्नल को अच्छी तरह से पता है।