如何获取特定表的每日阻塞发生时间及时长报告?
特定表阻塞查询(含发生时间及时长)
现有查询仅能展示进程间的阻塞关系,但无法关联到具体锁定的表,也没有时间维度的数据。如果当前没有正在发生的阻塞,自然返回空结果。以下是改进后的查询,可过滤特定表、获取阻塞发生时间及时长:
SELECT -- 被阻塞进程信息 blocked.session_id AS 被阻塞SPID, blocked.login_name AS 被阻塞登录名, blocked.host_name AS 被阻塞主机名, blocked.program_name AS 被阻塞程序名, -- 阻塞进程信息 blocking.session_id AS 阻塞SPID, blocking.login_name AS 阻塞登录名, blocking.host_name AS 阻塞主机名, blocking.program_name AS 阻塞程序名, -- 锁定的表信息 OBJECT_NAME(l.resource_associated_entity_id) AS 锁定表名, -- 阻塞时间信息 req.start_time AS 阻塞开始时间, DATEDIFF(SECOND, req.start_time, GETDATE()) AS 阻塞时长(秒), DATEDIFF(MINUTE, req.start_time, GETDATE()) AS 阻塞时长(分钟) FROM sys.dm_tran_locks l JOIN sys.dm_exec_requests req ON l.request_session_id = req.session_id JOIN sys.dm_exec_sessions blocked ON req.session_id = blocked.session_id LEFT JOIN sys.dm_exec_sessions blocking ON req.blocking_session_id = blocking.session_id JOIN sys.objects o ON l.resource_associated_entity_id = o.object_id WHERE req.blocking_session_id <> 0 AND o.name = '你的目标表名' -- 替换为你要监控的特定表名 ORDER BY 阻塞时长(秒) DESC;
关键说明:
- 关联
sys.dm_tran_locks获取锁资源,通过sys.objects映射到具体表名,实现特定表过滤 - 利用
sys.dm_exec_requests的start_time字段得到阻塞开始时间,通过DATEDIFF计算实时阻塞时长 - 如果当前没有针对该表的阻塞,仍会返回空结果,这属于正常情况
如果需要追踪历史阻塞事件,可考虑配置SQL Server扩展事件(Extended Events)或开启阻塞监控日志,以便事后排查超时问题。
内容的提问来源于stack exchange,提问作者TheMortiestMorty
相关产品推荐
相关产品推荐

