SQL Server 2008 dispose de plusieurs façons d'identifier les processus et les requêtes impliqués dans un blocage.
-
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
-
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.