Yürütülmesi buradan sorgu varsayılan genişletilmiş olaylar oturumun dışarı çıkmaz olaylarını çekmeye
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';
makineme tamamlamak için yaklaşık 20 dakika sürer. Rapor edilen istatistikler
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
Maddeyi kaldırırsam, geri dönen 3,782 satır döndüren bir saniyeden daha kısa sürede tamamlanır.
Benzer şekilde OPTION (MAXDOP 1)
, şimdi çok daha az lob okuma gösteren istatistikler ile işleri hızlandıran orijinal sorguyu eklersem.
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.
Yani benim sorum
Neler olduğunu açıklayan var mı? Orijinal plan neden bu kadar feci bir şekilde daha kötü ve bu problemden kaçınmanın güvenilir bir yolu var mı?
İlave:
Ayrıca, sorguyu INNER HASH JOIN
bir dereceye kadar iyileştirmek için sorguyu değiştirmenin bir dereceye kadar iyileştirdiğini buldum (ancak> 3 dakika sürer), DMV sonuçları çok küçük olduğundan, Join türünün kendisinin sorumlu olduğundan ve başka bir şeyin değişmiş olması gerektiğini düşündüğünden şüpheliyim. Bunun için İstatistikleri
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.
(Genişletilmiş etkinlik halka tamponu doldurduktan sonra DATALENGTH
bir XML
4.880.045 bayt olduğunu ve 1.448 olayları ihtiva etmiştir.) İle ve olmadan orijinal sorgu versiyonu basılı bir kesim test MAXDOP
ipucu.
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
Aşağıdaki sonuçları verdi
+-------------------------------------+------+----------+
| | 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 |
+-------------------------------------+------+----------+
Tempdb tahsislerinde belirgin bir fark var. Daha hızlı olanı gösterilen 616
sayfalar tahsis edildi ve tahsis edildi. Bu, XML de bir değişkene alındığında kullanılan sayfaların aynı miktarıdır.
Yavaş plan için bu sayfa tahsisi sayımları milyonlarca. Sorgu dm_db_task_space_usage
çalışırken, sorgulama, tempdb
sayfaların herhangi bir zamanda tahsis edilen 1.800 ila 3.000 sayfa arasında herhangi bir yerde sürekli olarak tahsis edildiğini ve tahsis edildiğini gösteriyor.
WHERE
tümceyi XQuery ifadesine taşıyabilirsiniz ; hızlı gitmek için mantık kaldırılacak zorunda değildir:TargetData.nodes ('RingBufferTarget[1]/event[@name = "xml_deadlock_report"]')
. Bununla birlikte, XML içini, sorduğunuz soruyu cevaplayacak kadar iyi tanımıyorum.