SQL Server 2008 bietet mehrere Möglichkeiten zum Identifizieren von Prozessen und Abfragen, die an Deadlocks beteiligt sind.
-
Wenn Deadlocks einfach zu reproduzieren sind, ist die Häufigkeit höher und Sie können SQL-Server profilieren (Sie haben die Zugriffs- und Leistungskosten auf dem Server, wenn Profiler aktiviert ist), indem Sie SQL Profiler verwenden, um eine schöne grafische Ansicht von Deadlocks zu erhalten. Diese Seite enthält alle Informationen, die Sie benötigen müssen Deadlock-Graphen verwendenhttp://sqlmag.com/ Datenbank-Performance-Optimierung/Erfassung-Deadlock-Informationen-Deadlock-Graph
-
Meistens ist das Reproduzieren von Deadlocks schwierig, oder sie treten in Produktionsumgebungen auf, in denen wir Profiler nicht daran anhängen und die Leistung beeinträchtigen möchten.
Ich würde diese Abfrage verwenden, um Deadlocks zu bekommen:
SELECT
xed.value('@timestamp', 'datetime') as Creation_Date,
xed.query('.') AS Extend_Event
FROM
(
SELECT CAST([target_data] AS XML) AS Target_Data
FROM sys.dm_xe_session_targets AS xt
INNER JOIN sys.dm_xe_sessions AS xs
ON xs.address = xt.event_session_address
WHERE xs.name = N'system_health'
AND xt.target_name = N'ring_buffer'
) AS XML_Data
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed)
ORDER BY Creation_Date DESC
Ich würde NICHT in die Richtung gehen, (NOLOCK) zu verwenden, um Deadlocks zu beheben. Das ist ein rutschiger Abhang und das Verbergen des ursprünglichen Problems.