常见问题 SQL Server查询挂起阻塞
查询挂起不动了怎么处理
查询长时间无响应(被阻塞或死锁)的定位:查阻塞链与等待类型,决定等、杀或改写。
发布于 2026/11/11
所属频道 SQL Server
简短答案
查询挂起多是两种原因:被其他事务阻塞(锁等待),或自身执行计划慢。先查阻塞链,判断该「等它结束」还是「杀掉阻塞源」。
排查步骤
- 看当前所有请求与阻塞关系:
SELECT session_id, status, wait_type, blocking_session_id,
command, login_name
FROM sys.dm_exec_requests WHERE blocking_session_id <> 0 OR session_id <> @@SPID;
- 追阻塞源头:
SELECT s.session_id, s.login_name, t.text
FROM sys.dm_exec_sessions s
CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) t
WHERE s.session_id = 阻塞源会话ID;
- 判断:
- 阻塞源是长事务/大批量操作 → 评估业务影响后杀掉(
KILL 会话ID); - 阻塞源是正常业务 → 等其结束,别硬杀;
- 自身查询慢 → 取执行计划优化。
- 阻塞源是长事务/大批量操作 → 评估业务影响后杀掉(
- 在 SSMS 活动会话视图或「进程活动」里可视化阻塞链。
- 版本执行计划能力以 SQL Server 2022 Developer 条目页核对。
现象对照表
| 现象 | 判断 |
|---|---|
| 有 blocking_session_id | 被阻塞,追源头 |
| wait_type 为锁等待类 | 锁竞争 |
| 无阻塞、单纯慢 | 执行计划问题 |
操作小结
- 先分清「被阻塞」还是「自身慢」。
- 杀会话前评估业务影响,源头比挂起者优先处理。
- 长事务是阻塞大户,从应用侧缩短事务。