SQL Server 排查 CPU 过高与阻塞问题常用步骤

星野
星野
发布时间:2026-10-13| 4人浏览过
原创

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 性能优化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。