ডেডলক ইভেন্টগুলি ডিফল্ট বর্ধিত ইভেন্ট সেশন থেকে বের করতে এখান থেকে কোয়েরি সম্পাদন করা হচ্ছে
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
ক্লজটি সরিয়ে ফেলি তবে এটি ৩,782২ টি সারি ফেরার দ্বিতীয় সেকেন্ডের চেয়ে কম হয়ে যায়।
একইভাবে যদি আমি OPTION (MAXDOP 1)
মূল ক্যোয়ারীতে যুক্ত করি যা এখনকার পরিসংখ্যানগুলির সাথে খুব দ্রুত গতিতে কম পড়া দেখায় showing
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 মিনিট সময় নেয়) আমি সন্দেহ করি যে যোগদানের ধরণটি নিজেই দায়বদ্ধ এবং অনুমান করি অন্য কিছু অবশ্যই পরিবর্তন হয়েছে। তার জন্য পরিসংখ্যান
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.
প্রসারিত ইভেন্টগুলির রিং বাফারটি পূরণ করার পরে ( DATALENGTH
এর মধ্যে XML
4,880,045 বাইট ছিল এবং এতে 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
পৃষ্ঠাগুলি দ্রুত দেখানো পৃষ্ঠাগুলি বরাদ্দ করা হয়েছিল এবং অবনমিত হয়েছিল। এক্সএমএলকে কোনও ভেরিয়েবলের মধ্যে রাখলে এটি একই পরিমাণ পৃষ্ঠাগুলি ব্যবহৃত হয়।
ধীর পরিকল্পনার জন্য এই পৃষ্ঠা বরাদ্দ গণনা কয়েক মিলিয়ন। dm_db_task_space_usage
ক্যোয়ারী চলমান রয়েছে এমন পোলিংয়ের মাধ্যমে দেখা যাচ্ছে যে এটি tempdb
যে কোনও সময় একসাথে 1,800 এবং 3,000 পৃষ্ঠাগুলির বরাদ্দকৃত পৃষ্ঠাগুলি ক্রমাগত বরাদ্দ এবং অবনমিত করে চলেছে ।
WHERE
ক্লজটি এক্সকিউরি এক্সপ্রেশনে স্থানান্তর করতে পারেন ; যুক্তিবিজ্ঞান এটি দ্রুত যাওয়া অপসারণ করা হবে নেই:TargetData.nodes ('RingBufferTarget[1]/event[@name = "xml_deadlock_report"]')
। এটি বলেছিল, আপনার উত্থাপিত প্রশ্নের উত্তর দেওয়ার জন্য আমি এক্সএমএল ইন্টার্নালগুলি ভালভাবে জানি না।