《SQL》
-- 开启性能监控
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE '%stored%';
-- 查看存储过程执行统计
SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT/1000000000 AS exec_time_sec
FROM performance_schema.events_statements_summary_by_program
WHERE OBJECT_TYPE = 'PROCEDURE';
输出示例:
| stored_procedure1 | 150 | 2.34 |
| stored_procedure2 | 80 | 12.57|
分析重点:高频调用或耗时长的存储过程优先优化
2.SHOW PROFILE(兼容旧版本)
《SQL》
SET profiling = 1;
CALL your_procedure();
SHOW PROFILES; -- 显示所有查询耗时
SHOW PROFILE CPU, BLOCK IO FOR QUERY 2; -- 详细资源消耗
3.EXPLAIN分析SQL片段
《SQL》
EXPLAIN SELECT * FROM orders WHERE total > 1000; -- 检查索引使用情况
关键指标:type(扫描类型)、rows(预估扫描行数)、Extra(是否使用临时表/文件排序)
《SQL》
-- 以sys用户执行
@?/rdbms/admin/profload.sql -- 创建DBMS_PROFILER包
@?/rdbms/admin/proftab.sql -- 创建分析结果表(在目标用户下执行)
使用流程:
《SQL》
BEGIN
DBMS_PROFILER.START_PROFILER('Test Run 1');
your_procedure(); -- 执行待分析存储过程
DBMS_PROFILER.STOP_PROFILER();
END;
/
结果解读:
《SQL》
SELECT u.unit_name, d.line#, d.total_time
FROM plsql_profiler_data d
JOIN plsql_profiler_units u ON d.runid = u.runid
WHERE u.run_comment = 'Test Run 1'
ORDER BY d.total_time DESC;
输出示例:
| CALC_BONUS | 45 | 3800ms | -- 第45行代码耗时最长
```[^2][^3]
SP:Starting
/SP:Completed
事件Duration
(执行时间)、Reads/Writes
(IO消耗)《SQL》
SET SHOWPLAN_XML ON; -- 生成预估执行计划
GO
EXEC your_procedure;
GO
SET SHOWPLAN_XML OFF;
《SQL》
CREATE EVENT SESSION [proc_perf] ON SERVER
ADD EVENT sqlserver.rpc_completed(
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[database_name]),'YourDB')
)
ADD TARGET package0.event_file(SET filename=N'proc_perf.xel');
EXPLAIN ANALYZE
(8.0+支持实际执行统计)DBMS_XPLAN.DISPLAY_CURSOR
NVARCHAR
导致索引失效)指标类型 | 工具支持 | 优化方向 |
---|---|---|
CPU时间 | SHOW PROFILE, DBMS_PROFILER | 算法优化、减少计算复杂度 |
物理读次数 | Performance Schema, Profiler | 索引优化、缓存命中率提升 |
逻辑写次数 | 扩展事件 | 事务拆分、批量提交 |
锁等待时间 | 数据库日志分析 | 隔离级别调整、死锁检测 |
****** | *************** | ******* |
****** | *************** | ******* |
****** | *************** | ******* |
EXPLAIN
/执行计划快速定位明显问题《SQL》
-- 检查参数与字段类型一致性
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'orders';
-- 示例问题修复
ALTER PROCEDURE GetOrders
@TotalAmount DECIMAL(10,2) -- 原为NVARCHAR导致类型转换
AS
BEGIN
SELECT * FROM orders WHERE total > @TotalAmount;
END
```[^4]
Using filesort
?total_time
的单位是什么?原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有