资讯动态

Oracle数据库CPU飙到70%?别慌,手把手教你用AWR报告揪出‘元凶’SQL

发布时间:2026/9/25 20:58:00 来源:尧图企业网站定制
Oracle数据库CPU飙升至70%AWR报告深度解析与实战优化指南引言当数据库告警灯亮起时凌晨3点15分监控系统的刺耳警报划破了运维中心的宁静——生产环境Oracle数据库CPU使用率突破70%阈值。作为DBA这种场景如同急诊室的急救铃需要我们迅速定位问题源头。与大多数性能问题不同CPU高负载往往像一场无声的火灾没有明显的锁等待或I/O瓶颈却能让整个系统陷入瘫痪。传统排查方法如实时监控v$session或ASH报告虽能提供即时快照但面对持续性CPU高压这类复杂问题AWRAutomatic Workload Repository报告才是真正的时间机器。它能记录数据库在过去数小时甚至数天内的完整性能画像特别是那些转瞬即逝却影响深远的SQL执行特征。本文将还原一次真实的高CPU故障排查全过程从报警触发到最终优化重点揭示如何像刑侦专家一样解读AWR中的关键线索。1. 生成AWR报告捕获犯罪现场1.1 确定快照时间窗口当CPU持续高位运行时首要任务是选择包含异常时段的两个连续快照。通过以下查询确认可用快照范围SELECT snap_id, begin_interval_time, end_interval_time FROM dba_hist_snapshot ORDER BY snap_id DESC;关键技巧快照间隔建议覆盖异常开始前1小时至恢复正常后30分钟这对分析问题演变趋势至关重要。如果默认1小时快照间隔错过关键时段可手动创建快照EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();1.2 生成报告的标准操作使用Oracle内置脚本生成HTML格式报告更易分析sqlplus / as sysdba ?/rdbms/admin/awrrpt.sql参数选择要点报告类型HTML支持交互式分析天数通常选1天内的快照快照ID输入异常时段的起止snap_id注意生产环境建议将报告生成在服务器本地后下载避免直接在SQL*Plus中查看大文件导致会话超时1.3 报告结构速览完整AWR报告包含200项指标高CPU问题需重点关注以下章节章节关键指标CPU问题关联性数据库负载概览DB Time vs DB CPU确认CPU是否为瓶颈等待事件Top 5 Timed Events检查CPU等待占比SQL统计SQL ordered by CPU Time定位高消耗SQL实例效率Buffer Hit Ratio排除内存不足影响操作系统统计CPU Usage per Core确认硬件负载分布2. 解读AWR报告寻找性能元凶2.1 数据库负载诊断在报告开头的Load Profile部分重点关注以下指标对比DB Time(s): 12,345 DB CPU(s): 10,987 Elapsed Time(s): 3,600 CPU Count: 16计算法则DB Time / (Elapsed * CPU Count) 1表示CPU资源饱和DB CPU / DB Time 70%确认是CPU密集型负载案例中这两个比值分别为2.14和89%明确指向CPU计算资源不足。2.2 等待事件分析查看Top 5 Timed Events部分健康数据库应主要显示I/O类等待事件。当看到如下情况时需警惕Event Waits Time(s) Avg(ms) % DB time ------------------- ------ ------- ------- -------- CPU time 8,247 89.2 db file sequential read 12,345 456 37 4.9关键结论CPU时间占比超过85%且无其他显著等待事件说明系统正在纯粹地进行计算密集型操作。2.3 SQL消耗排行解密进入SQL Statistics → SQL ordered by CPU Time这里隐藏着真正的罪犯SQL。典型的高CPU SQL具有以下特征高频执行执行次数Executions与单次CPU时间CPU per Exec的乘积大低效运算包含全表扫描、复杂计算或未优化的PL/SQL异常模式非业务高峰时段的突然激增示例报告片段SQL ID CPU Time(s) Executions CPU per Exec SQL Text ------------- ----------- ---------- ------------ -------------------------- a1b2c3d4e5 3,456 28,901 0.12 SELECT COUNT(*) FROM ... f6g7h8i9j0 1,234 1,234 1.00 SELECT * FROM ... ORDER BY深度排查技巧点击SQL ID查看完整执行计划对比CPU per Exec与手动执行时间的差异可能因绑定变量不同检查Elapsed Time与CPU Time的比值接近1.0说明几乎没有I/O等待3. 实战优化从诊断到解决方案3.1 高频COUNT查询优化对于报告中发现的TOP1 SQLSELECT COUNT(*) FROM EDU_COURSE_CLASS_STUINFO WHERE CLASS_ID:1问题诊断执行28,901次总CPU时间3,456秒手动执行仅需0.05秒但生产环境平均0.12秒优化方案对比方案实施难度预期效果适用场景应用缓存中等减少90%查询数据变化不频繁物化视图较高查询降为0.01秒实时性要求低冗余计数低完全消除查询有写权限且逻辑简单最终选择采用Redis缓存计数结果设置5秒过期时间。优化后该SQL执行频率降至1/10。3.2 全表扫描SQL重构针对TOP2 SQLSELECT * FROM SYNDATA WHERE synflag:1 ORDER BY createtime执行计划分析------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 500K| 47M| 28488 (1)| 00:05:42 | | 1 | SORT ORDER BY | | 500K| 47M| 28488 (1)| 00:05:42 | |* 2 | TABLE ACCESS FULL| SYNDATA | 500K| 47M| 2345 (1)| 00:00:28 | -------------------------------------------------------------------------------优化步骤确认synflag字段基数SELECT COUNT(DISTINCT synflag) FROM SYNDATA结果为3不适合索引分析业务需求实际只需同步当天数据创建函数索引CREATE INDEX idx_synflag_date ON SYNDATA(synflag, createtime)改写SQLSELECT * FROM SYNDATA WHERE synflag:1 AND createtime TRUNC(SYSDATE) ORDER BY createtime效果验证执行计划变为索引范围扫描平均响应时间从16秒降至0.15秒CPU消耗减少98%4. 高级技巧与预防措施4.1 AWR报告对比分析当优化措施实施后生成新的AWR报告并与原报告对比?/rdbms/admin/awrddrpt.sql关键对比维度数据库负载变化DB CPU下降比例SQL统计变化原问题SQL排名和消耗等待事件迁移是否出现新瓶颈4.2 自动化监控配置通过以下脚本设置CPU使用率预警BEGIN DBMS_SERVER_ALERT.SET_THRESHOLD( metrics_id DBMS_SERVER_ALERT.CPU_TIME_PERCENT, warning_operator DBMS_SERVER_ALERT.OPERATOR_GE, warning_value 70, critical_operator DBMS_SERVER_ALERT.OPERATOR_GE, critical_value 85, observation_period 5, consecutive_occurrences 3, instance_name NULL, object_type DBMS_SERVER_ALERT.OBJECT_TYPE_SYSTEM, object_name NULL); END; /4.3 定期健康检查项建立每周AWR基线分析制度重点关注CPU增长趋势SELECT snap_id, begin_interval_time, value FROM dba_hist_sysmetric_summary WHERE metric_nameCPU Usage Per Sec ORDER BY snap_id;SQL性能退化检测SELECT sql_id, executions_delta, cpu_time_delta/executions_delta as cpu_per_exec FROM dba_hist_sqlstat WHERE executions_delta 1000 ORDER BY cpu_time_delta DESC;索引使用分析SELECT index_name, table_name, blevel, leaf_blocks FROM dba_indexes WHERE last_analyzed SYSDATE-7 AND leaf_blocks 10000;在最近一次季度巡检中通过提前发现一个存储过程每月初的CPU消耗增长模式我们避免了潜在的生产事故。这种模式在常规日检中很难察觉只有通过长期AWR基线对比才能捕捉。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑