Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Dépannage des interblocages dans SQL Server 2008

SQL Server 2008 dispose de plusieurs façons d'identifier les processus et les requêtes impliqués dans un blocage.

  1. Si les blocages sont faciles à reproduire, la fréquence est plus élevée et vous pouvez profiler le serveur SQL (vous avez le coût d'accès et de performance sur le serveur lorsque le profileur est activé) en utilisant SQL Profiler vous donnera une belle vue graphique du blocage. Cette page contient toutes les informations que vous besoin d'utiliser des graphes d'interblocage base de données-performance-tuning/collecte-deadlock-information-deadlock-graph

  2. La plupart du temps, la reproduction des blocages est difficile, ou ils se produisent dans un environnement de production où nous ne voulons pas y attacher Profiler et affecter les performances.

J'utiliserais cette requête pour obtenir des blocages :

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

Je n'irais PAS dans le sens de l'utilisation de (NOLOCK) pour résoudre les blocages. C'est une pente glissante et cachant le problème initial.