Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fehlerbehebung bei Deadlocks in SQL Server 2008

SQL Server 2008 bietet mehrere Möglichkeiten zum Identifizieren von Prozessen und Abfragen, die an Deadlocks beteiligt sind.

  1. 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

  2. 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.