Oracle AWR(Automatic Workload Repository)是数据库内置的性能数据仓库,默认每小时自动采集一次系统运行快照,保存一段时间后将数据汇总为报告。它是排查数据库性能问题的核心依据,比起让用户口头描述卡顿,一份报告能客观还原那个时段内数据库真实在忙什么。

一、AWR报告如何生成
最常用的方式是通过命令行调用Oracle自带脚本。以Oracle 11g及以上版本为例,登录服务器后使用具有DBA权限的账号进入SQL*Plus,执行@?/rdbms/admin/awrrpt.sql,系统会交互式询问报告格式(html或text)、要查看的天数、以及起止快照ID。确认后脚本会在当前目录生成awrrpt_1_xxxx.html这类文件,直接用浏览器打开即可。
如果不习惯命令行,也可以通过Oracle Enterprise Manager(OEM)界面操作。在性能页面选择AWR报告,框选两个快照时间点就能在线生成并查看。对于托管环境或云数据库,部分平台还提供一键导出功能。无论哪种方式,核心都是选定一段有代表性的业务高峰期区间,避免选到半夜无人访问的空闲时段,否则报告没有诊断价值。
1.1 快照ID的选取技巧
快照ID决定了报告覆盖的时间窗。通常建议选取问题发生前后各半小时到一小时内的两个快照,这样既能看到异常负载,也有正常基线可做对比。若系统持续缓慢,可拉取一整天中多个时段报告横向比较。
在数据库中可通过查询dba_hist_snapshot视图列出所有可用快照及对应时间。例如执行select snap_id, begin_interval_time from dba_hist_snapshot order by snap_id;就能快速定位目标。注意不要选间隔过长的快照,比如相隔一天,那样报告中的每秒平均值会被拉平,掩盖短时尖峰。
二、报告核心板块解读
打开HTML版报告,最前面是数据库信息和快照时段概要。往下滚动会看到多个关键区域,其中最需要关注的有三个:数据库负载画像(Load Profile)、Top 10 SQL、以及等待事件(Wait Events)。这三块分别回答了系统忙不忙、谁在消耗资源、时间花在哪三个问题。
初学者容易陷在缓冲区命中率这类旧指标里,实际上现代Oracle版本更看重时间模型。也就是说,与其看命中率多高,不如看数据库时间(DB Time)里多少花在CPU、多少花在I/O等待。下面分板块说明。
2.1 负载画像看什么
Load Profile表格以每秒和每事务两种维度列出redo大小、逻辑读、物理读、用户调用次数等。如果物理读每秒异常高,说明大量请求绕过了内存直接读盘,往往意味着SQL缺少合适索引或共享池计划失效。逻辑读过高则可能是代码里写了全表扫描的循环。
结合DB Time与Elapsed时间的比例,能判断数据库是否饱和。比如Elapsed为60分钟,DB Time为240分钟,代表在采集期内平均约4个活跃会话在并发消耗资源。若该值远大于CPU核数,基本可确定存在排队与争用。
2.2 Top SQL定位罪魁
报告中的SQL Statistics按不同排序(如CPU、Elapsed、Gets)列出消耗最高的语句。点开对应SQL文本,可看到执行计划。若某条简单查询排在Elapsed首位且执行次数极高,多半是应用层没做绑定变量,导致硬解析风暴。
对于排在前面的缓慢SQL,重点看其Rows、Cost与实际返回行是否匹配。若Cost很低但真实扫描百万行,通常是统计信息过期。此时收集表统计信息往往比改SQL更快见效。
2.3 等待事件暴露瓶颈
Wait Events按等待时长排序。db file sequential read代表单块读等待,常指向索引扫描的磁盘慢;log file sync高则说明提交频繁且redo写盘慢,可能与存储或commit方式有关。通过等待类占比,能区分是算不动(CPU)还是等不起(I/O、锁)。
| 等待事件 | 典型含义 | 初步应对 |
|---|---|---|
| db file scattered read | 多块全表扫描读 | 评估缺失索引或分区 |
| enq: TX - row lock contention | 行锁争用 | 检查事务过长或并发更新同行 |
| latch: shared pool | 共享池闩锁 | 使用绑定变量减少硬解析 |
三、从报告到行动
解读完上述板块,应形成假设再验证。例如等待事件以I/O为主且物理读高,可先确认Top SQL里是否有全表扫描,将其改写或建索引后观察下一时段报告是否改善。若CPU等待为主而SQL本身不复杂,则要考虑实例规格是否不足。
切忌看完报告随手调sga_target或加CPU。AWR只是显微镜,不是说明书。把它和业务的真实变更(如新上线批量 job)对照,才能避免无效折腾。养成定期采集高峰报告做基线的习惯,下次异常时一眼就能看出偏离在哪里。
Oracle_AWR性能诊断报告分析修改时间:2026-08-11 10:51:43