Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Risoluzione dei problemi di deadlock in SQL Server 2008

SQL Server 2008 offre diversi modi per identificare i processi e le query coinvolti nel deadlock.

  1. Se i deadlock sono facili da riprodurre, la frequenza è più alta e puoi profilare il server SQL (hai l'accesso e il costo delle prestazioni sul server quando il profiler è abilitato) usando SQL Profiler ti darà una bella vista grafica del deadlock. Questa pagina ha tutte le informazioni di cui hai bisogno è necessario utilizzare i grafici deadlockhttp://sqlmag.com/ database-performance-tuning/gathering-deadlock-information-deadlock-graph

  2. La maggior parte delle volte la riproduzione dei deadlock è difficile, oppure si verificano in un ambiente di produzione in cui non vogliamo collegare Profiler ad esso e influire sulle prestazioni.

Userei questa query per ottenere i deadlock:

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

NON andrei nella direzione di utilizzare (NOLOCK) per correggere i deadlock. Questa è una pendenza scivolosa e nasconde il problema originale.