You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取特定表的每日阻塞发生时间及时长报告?

特定表阻塞查询(含发生时间及时长)

现有查询仅能展示进程间的阻塞关系,但无法关联到具体锁定的表,也没有时间维度的数据。如果当前没有正在发生的阻塞,自然返回空结果。以下是改进后的查询,可过滤特定表、获取阻塞发生时间及时长:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:13:13