讲师中心 微信公众号
AI工具推荐 视频效率加速

如何诊断SQL存储过程导致的系统资源占用过高问题?

星磊小哥_4835

星磊小哥_4835

发布时间:2026-07-17 17:49:57

|

458人浏览过

|

来源于php中文网

原创

直接查sys.dm_exec_requests和sys.dm_exec_sessions结合sys.dm_exec_sql_text,筛选status为running/suspended且cpu_time>10000或logical_reads>100000的会话,通过sql_handle关联实际SQL文本,重点识别command为EXECUTE或RPC的行以定位存储过程入口点。

如何诊断sql存储过程导致的系统资源占用过高问题?

查正在运行的高资源消耗存储过程

直接定位问题源头,别猜。SQL Server里存储过程一旦跑起来,就变成普通查询,但它的调用链和执行上下文藏在系统视图里。重点查 sys.dm_exec_requests 和 sys.dm_exec_sessions,结合 sys.dm_exec_sql_text 把实际执行的语句捞出来:

  • 先过滤出状态为 'running' 或 'suspended' 且 cpu_time > 10000(毫秒)或 logical_reads > 100000 的会话
  • 用 sql_handle 关联 sys.dm_exec_sql_text,确认文本确实是某个存储过程体内的语句,而不是动态拼接的裸SQL
  • 特别注意 command 列显示为 EXECUTE 或 RPC 的行——这大概率是存储过程入口点

示例片段:

SELECT 
    r.session_id,
    s.login_name,
    t.text AS actual_sql,
    r.cpu_time,
    r.logical_reads,
    r.wait_type
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.status IN ('running', 'suspended')
  AND (r.cpu_time > 10000 OR r.logical_reads > 100000)
  AND s.session_id > 50;

识别存储过程内部低效结构

很多存储过程看起来“封装得挺好”,实则藏着性能炸弹。真正吃资源的往往不是那句 EXEC MyProc,而是它里面反复调用的标量函数、嵌套循环、未参数化的临时表,或者隐式类型转换。

  • SELECT 语句里调用 UDF(用户定义标量函数):每行都执行一次,无法并行,CPU飙升典型诱因
  • 用 WHILE 循环逐行处理数据:比集合操作慢几个数量级,sys.dm_exec_query_stats 里能看到 execution_count 高但 total_elapsed_time 更高
  • 临时表没加索引就 JOIN 或 ORDER BY:触发大量 Sort 和 Spool 操作,内存授予暴涨
  • 参数未用 @param 而是拼字符串进 EXEC:导致每次重编译,plan_generation_num > 1

查法:对目标存储过程,用 sys.dm_exec_procedure_stats 看累计指标,再用 sys.dm_exec_query_plan 提取执行计划 XML,搜索关键词 <relop logicalop="Compute Scalar"></relop> 或 <relop logicalop="Table Spool"></relop>。

区分是单次执行慢还是持续占用资源

存储过程引发的资源问题分两类:一种是单次执行太久(比如跑10分钟),另一种是执行完也不释放——比如开了事务没提交、用了 table variable 却被意外缓存、或 CLR 集成后 AppDomain 没卸载。

  • 看 sys.dm_exec_sessions 的 open_transaction_count:非零值说明事务卡住,可能锁表+阻塞其他会话
  • 查 sys.dm_os_memory_clerks 里 type = 'USERSTORE_TOKENPERM' 或 'CACHESTORE_OBJCP' 是否异常大——前者代表执行计划缓存膨胀,后者是对象缓存,常由大量不同参数的存储过程调用引起
  • 如果错误日志出现 701(内存不足)或 8645(内存授予失败),大概率是某次执行申请了巨量内存但没及时归还

注意:DBCC FREEPROCCACHE 可清计划缓存,但会全局抖动;更稳妥的是只清特定存储过程:DBCC FREEPROCCACHE (plan_handle),plan_handle 从 sys.dm_exec_cached_plans 查。

验证是否真由存储过程引起而非外部干扰

别一上来就翻存储过程代码。先排除常见干扰项,否则优化半天发现是别人在备份、DBA 在跑 DBCC CHECKDB、或者 OS 层面有其他进程抢内存。

  • 用 sys.dm_os_sys_memory 确认 available_physical_memory_kb 是否真的低——如果还有几GB空闲,那 SQL Server 占内存就是正常行为,不是 bug
  • 查 sys.dm_exec_background_jobs(SQL Server 2022+)或作业历史,看是否有维护任务正在跑
  • 对比 sys.dm_os_wait_stats 中 LCK_M_XX、PAGEIOLATCH_XX、RESOURCE_SEMAPHORE 等等待类型占比:如果是锁等待主导,问题在事务设计;如果是 RESOURCE_SEMAPHORE,才是内存授予瓶颈

真正棘手的是那种“看起来像存储过程问题,其实是调用方传参不当”——比如前端传了个空字符串当 @id,导致存储过程走全表扫描分支。这种必须结合应用日志和参数化查询痕迹一起看。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4783

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

971

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1249

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6801

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3503

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6780

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9401

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1270

2024.04.29

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn