Luchando contra los problemas de bloqueos recientes, donde una transacción esta tomando todo en modo exclusivo por un gran periodo de tiempo causando time out a las consultas de los demás usuarios o aplicaciones, he tenido que armar una consulta para reportarlos.
En principio, partimos desde la Sys.dm_tran_locks donde se muestran los bloqueos, para luego anexar la sys.dm_os_waiting_tasks por el campo lock_owner_address y estas tres a fin de tener un poco de info extra: 1) sys.objects 2) sys.partitions 3) sys.allocation_units….
El resultado en cuestión:
SELECT
DB_NAME(tl.resource_database_id) as 'DB Name',
tl.resource_type,
tl.resource_associated_entity_id,
tl.request_mode,
tl.request_session_id,
wt.blocking_session_id,
obj.name as 'Object Name',
obj.type_desc as 'Object Desc',
pa.partition_id as 'Partition ID',
tl.request_status,
pa.rows as 'Partition rows numbers',
al.type_desc as 'Index Desc',
al.container_id as 'Storage container_id'
FROM sys.dm_tran_locks as tl
INNER JOIN sys.dm_os_waiting_tasks as wt
ON tl.lock_owner_address = wt.resource_address
LEFT JOIN sys.objects obj
on obj.object_id = tl.resource_associated_entity_id
LEFT JOIN sys.partitions pa
on pa.hobt_id = tl.resource_associated_entity_id
LEFT JOIN sys.allocation_units al
on al.allocation_unit_id = tl.resource_associated_entity_idFuente: sqlserver-dba.com
