SQL Server 排查 CPU 过高与阻塞问题常用步骤
SQL Server 运行过程中若出现响应缓慢或负载激增,通常由 CPU 占用过高或 SQL 阻塞引起。掌握利用系统视图与存储过程定位异常会话的方法,是进行数据库性能调优的基础。
CPU 占用过高的排查步骤
当服务器 CPU 负载持续偏高时,可通过查询系统动态视图找出消耗资源最多的 SQL 语句。以下脚本用于筛选 CPU 使用时间较长的会话(以 500 毫秒为阈值,可根据实际环境调整):
WITH ProcessCTE(blocked) AS
(
SELECT spid FROM sys.sysprocesses WHERE cpu > 500
)
SELECT distinct a.*
FROM (
SELECT TEXT, AA.* FROM sys.sysprocesses AA
CROSS APPLY sys.dm_exec_sql_text(AA.sql_handle)
) a
JOIN ProcessCTE bucte WITH(NOLOCK)
ON bucte.blocked = a.spid
ORDER BY a.CPU DESC
SQL 阻塞问题的排查与处理
数据库阻塞会导致事务等待执行,影响业务并发。排查阻塞通常需要结合动态视图分析与系统存储过程查看细节。
第 1 步:识别阻塞来源
使用以下 SQL 查询处于阻塞状态的进程及其发起的 SQL 文本:
WITH ProcessCTE(blocked) AS
(
SELECT blocked FROM sys.sysprocesses WHERE blocked > 0
UNION ALL
SELECT blocked FROM sys.sysprocesses WHERE blocked > 0
)
SELECT distinct a.*
FROM (
SELECT TEXT, AA.* FROM sys.sysprocesses AA
CROSS APPLY sys.dm_exec_sql_text(AA.sql_handle)
) a
JOIN ProcessCTE bucte WITH(NOLOCK)
ON bucte.blocked = a.spid
ORDER BY a.blocked DESC
第 2 步:使用系统存储过程分析
sp_who2 用法
该存储过程返回当前用户会话信息,比 sp_who 更详细,常用于快速概览。语法如下:EXEC sp_who ['loginname' | 'active']。
- 列出全部当前进程:
EXEC sp_who; - 列出特定用户的进程:例如查看用户
janetl的状态:EXEC sp_who 'janetl'; - 显示所有活动进程(过滤掉休眠连接):
EXEC sp_who 'active'; - 显示特定会话ID的信息:例如查看 ID 为 10 的进程:
EXEC sp_who 10;
关键字段说明:
blk:阻塞进程的 SPID;CPUTime:进程占用的总 CPU 时间;DiskIO:磁盘 I/O 次数。
注意:sys.sysprocesses 视图在现代版本中虽可用,但推荐使用 sys.dm_exec_requests 等 DMV,上述示例兼容旧版习惯。
第 3 步:深入查看锁详情 (sp_lock)
sp_lock 可返回数据库中活动的详细信息,包括持有锁的进程、被锁对象及锁模式。参数格式:sp_lock [@spid1 =] 'session ID1' [, [@spid2 =] 'session ID2']。
结果集字段说明:
Type(锁类型):
- RID:行级锁
- PAG:数据页或索引页锁
- TAB:表级锁
- KEY:索引键范围锁Mode(锁模式):
- S (共享):读取数据时持有
- X (排他):修改数据时持有
- U (更新):防止死锁的更新操作锁
- IX (意向排他):表级别意向锁Status(请求状态):
- GRANT:已成功获取锁
- WAIT:正在等待其他进程释放锁
- CNVRT:锁正在转换中但受阻
第 4 步:查看最后执行的命令 (DBCC INPUTBUFFER)
如果确定某个 SPID 存在问题,可以使用 DBCC INPUTBUFFER 查看该连接最后一次发送给 SQL Server 的语句,以便进一步分析原因。
DBCC INPUTBUFFER (11) -- 将 11 替换为目标 SPID
返回值包含 EventType(如 Language Event)、Parameters 和 EventInfo(即具体 SQL 文本的前 255 个字符)。
总结
面对 SQL Server 的性能瓶颈,首先通过动态视图定位 CPU 或阻塞源,随后利用 sp_who2 快速锁定会话,并通过 sp_lock 与 DBCC INPUTBUFFER 细化到具体的锁对象与 SQL 语句。这组组合拳能有效帮助 DBA 定位并解决常见的运行异常。
以上就是 SQL Server 异常处理常用步骤的详细内容,更多关于 SQL Server 性能优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









