导读:本期聚焦于Ada创作的《Oracle AWR自动工作负载仓库如何辅助定位数据库性能瓶颈?》,敬请观看详情。排查Oracle数据库性能问题时,你是否经常感到缺少一份能还原历史运行状况的详细档案?AWR作为Oracle 10g引入的自动工作负载仓库,恰好弥补了Statspack需要手动采集、粒度较粗的短板。它默认每小时生成一次性能快照,并保留一段时间供对比分析,其中累积了等待事件、SQL执行统计、系统负载、I/O和内存活动等核心指标。借助AWR报告,DBA无需在故障发生时实时值守,也能回溯问题时段的数据库行为,从Top等待事件和资源消耗最高的SQL入手,逐步收敛瓶颈范围。本文将围绕AWR的底层采集机制、报告阅读方法以及常见的诊断思路展开说明。

想要弄清楚AWR的价值,先得理解它到底在记录什么。简单来说,AWR是Oracle数据库内部的一个长期统计信息仓库,它周期性采集与数据库负载相关的各类活动数据,并把这些数据以快照的形式持久化保存。这些数据并非零散的日志,而是经过整合的累积指标和增量指标,覆盖了内存使用、等待事件、SQL执行情况、系统级统计、I/O读写等多个维度。通过对两个不同时间点的快照做差值计算,AWR报告能够还原出这段时间内数据库到底把时间耗费在了哪些环节上。

Oracle AWR自动工作负载仓库如何辅助定位数据库性能瓶颈?

从定位问题的角度看,AWR最大的意义在于提供了时间维度上的横向对比能力。比如某天凌晨出现了批处理任务变慢的情况,如果当时没有实时监控,事后依然可以通过AWR找到对应的快照区间,观察那时候的等待事件排名和负载曲线。相比Statspack,AWR不需要DBA手动设置作业,它在数据库创建后默认启用,由后台进程MMON自动完成采集和清理动作,运维成本明显更低。

还需要明确一点,AWR并不是一个单纯的性能日志,它是一套完整的工作负载分析框架。除了最常用的文本报告,Oracle还将AWR数据作为自动数据库诊断监视器ADDM、SQL调优建议等功能的输入来源。也就是说,AWR采集的原始数据既可以直接生成报告供人工阅读,也可以被其他工具进一步加工分析,这使得它在Oracle 10g之后的诊断体系中处于核心位置。

AWR的核心组件与数据采集机制

AWR由几个关键部分组成,包括内存中的性能统计信息、落盘的历史快照、生成报告所需的SQL脚本以及负责自动维护的后台任务。其中最重要的概念就是快照。快照本质上是对特定时间点数据库统计信息的完整拷贝,默认情况下Oracle每隔60分钟生成一次,并且通过DBMS_WORKLOAD_REPOSITORY包可以调整间隔和保留时长。

在采集过程中,Oracle并不是把所有V$动态性能视图的内容都原封不动存下来。AWR会针对那些具有累计性质或反映系统状态的指标进行筛选和加工。例如等待事件的总等待次数、总等待时间、执行过的SQL的CPU时间、逻辑读、磁盘读、行处理数量等,这些数据大多以累计值形式保存。计算区间指标时,需要用后一个快照的累计值减去前一个快照的累计值,再除以区间时长,得到每秒的负载情况。这种设计避免了长期存储原始活动数据带来的空间膨胀问题。

自动采集由MMON进程触发,MMON会定期唤醒并检查是否需要生成快照,同时负责将内存中的统计信息刷入AWR底层的基表。AWR基表存储在SYSAUX表空间里,这也就解释了为什么Oracle 10g中SYSAUX表空间的默认大小会比原来的系统辅助表空间大很多。快照的保留策略默认是7天,用户可以根据实际需求通过如下PL/SQL代码调整快照间隔和保留时间:

BEGIN
  DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(
    retention => 43200,   -- 保留30天,单位:分钟
    interval  => 30,      -- 每30分钟采集一次
    topnsql   => 100      -- 每个维度保留Top 100的SQL
  );
END;
/

如果希望手动立刻创建一个快照,可以使用CREATE_SNAPSHOT过程。手动快照在应用发布或压力测试前非常有用,能够在时间轴上标记出一个明确的分界点。创建完成后,通过DBA_HIST_SNAPSHOT视图可以查看当前已经存在的快照编号和采集时间。

-- 手动创建AWR快照
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;

-- 查询最近10次快照信息
SELECT snap_id, begin_interval_time, end_interval_time
FROM (
  SELECT snap_id, begin_interval_time, end_interval_time
  FROM dba_hist_snapshot
  ORDER BY snap_id DESC
)
WHERE ROWNUM <= 10;

值得注意的是,AWR采集的快照并不是只有数据库空闲时才进行。哪怕系统正在经历极高负载,MMON依然会尽量完成快照生成,只是可能出现轻微延迟。此外,AWR的采集精度也受统计信息级别的影响。初始化参数STATISTICS_LEVEL必须设为TYPICAL或ALL,AWR才会正常自动采集。如果该参数被改成BASIC,很多AWR功能都会失效,这也是排查AWR无数据时首先要检查的设置。

如何生成并阅读AWR报告

生成AWR报告最常用的方式是在数据库服务器上执行awrrpt.sql脚本,该脚本通常位于ORACLE_HOME/rdbms/admin目录下。执行后会提示选择输出格式、输入起始快照ID和结束快照ID,最后生成一份HTML或文本格式的报告。对于RAC环境,则有专门的awrgrpt.sql用于生成整集群级别的报告。

报告中最先需要关注的是Summary部分。这里会列出快照区间内数据库的DB Time、CPU Time、用户调用次数、事务数等基本指标,同时也会给出Elapsed Time和DB Time的对比。DB Time是数据库处理用户请求所消耗的总CPU时间和非空闲等待时间之和,如果DB Time远大于Elapsed Time乘以CPU核数,说明系统存在较为严重的等待竞争。例如一个8核数据库在10分钟内DB Time达到400分钟,平均活跃会话数就是40,这意味着有大量会话在排队等待资源。

Load Profile部分显示每秒和每事务的资源消耗指标,比如每秒逻辑读、每秒物理读、每秒执行SQL数、每秒登录次数等。通过与历史正常时段的报告对比,可以判断当前负载是否偏离常态。随后是Instance Efficiency Percentages,也就是多种命中率指标。虽然命中率在性能分析中的重要性已经不像早期那样被绝对化,但Buffer Hit Ratio过低仍然可能是I/O压力的信号。

Top等待事件是AWR报告中最直接的诊断线索。按照总等待时间降序排列,每个等待事件都包含等待次数、总等待时间和平均等待时间。如果排在前面的都是CPU Time或正常的I/O等待,通常说明系统没有明显的瓶颈点。一旦发现诸如enq: TX - row lock contention、log file sync、db file sequential read等事件的等待占比异常高,就应该结合具体的应用操作和SQL语句进一步排查。下面的SQL可以直接查询某类等待事件在快照区间内的变化情况:

SELECT event_name, total_waits, time_waited_micro / 1000000 AS seconds_waited
FROM dba_hist_system_event
WHERE snap_id BETWEEN :begin_snap AND :end_snap
  AND event_name LIKE '%log file sync%'
ORDER BY time_waited_micro DESC;

SQL Statistics部分负责展示区间内消耗资源最高的SQL语句。按Elapsed Time排序后,通常最靠前的几条SQL就是优化的重点对象。AWR给出了每条SQL的执行次数、每次执行平均耗时、CPU时间、等待时间、逻辑读和物理读等关键指标。需要注意的是,有些SQL虽然逻辑读很高,但执行次数也非常大,平均消耗并不突出,这时要结合业务特点判断是否需要优化。另外,如果某条SQL的版本数很多,可能是因为绑定变量窥探或统计信息变化导致了多个执行计划,需要检查执行计划是否稳定。

AWR与Statspack的差异及使用注意事项

Oracle 9i时代DBA通常依赖Statspack进行性能分析,但它需要手工安装、手工调度采集任务,而且默认只收集有限范围的指标。AWR作为10g的原生组件,在采集深度、自动化程度和与其他诊断工具的集成上有明显优势。AWR收集的数据不仅包括Statspack原有的等待事件和系统统计,还扩充了时间模型、活动会话历史、段级统计、操作系统统计等丰富信息。

另一个关键差异是资源开销。Statspack在采集瞬间会执行大量查询来抓取V$视图数据,如果采集频率过高,本身就可能对生产系统造成一定压力。AWR的采集由Oracle内部机制完成,通过与自动内存管理、自动优化器统计信息收集等模块协同工作,降低了采集动作对前台业务的干扰。即便如此,在超大规模系统上,AWR的快照生成仍然会消耗一些CPU和I/O资源,因此不建议把间隔设置得过于激进,比如少于10分钟一次。

在使用AWR时,有几点需要特别注意。首先,快照默认只保留7天,如果做月度性能回顾,应该提前调大保留时间。其次,AWR报告展示的是区间内的平均情况,无法还原每一个瞬间的波动细节。如果问题是间歇性的短时尖刺,光看60分钟间隔的AWR报告可能发现不了问题,这时需要借助ASH,也就是活动会话历史,进行更细粒度的分析。再次,AWR数据存储在SYSAUX表空间中,如果快照保留策略过久或者系统SQL数量庞大,SYSAUX可能会膨胀,需要定期检查空间占用情况。

最后,要正确理解AWR报告中的指标含义,避免陷入过度优化单项指标的错误路径。比如单纯为了把Buffer Hit Ratio从95%提高到99%而大幅增加缓存,未必能带来业务上的实际改善。更好的做法是从DB Time、Top等待事件和Top SQL三个维度出发,先找到真正影响用户体验的环节,再结合AWR提供的具体证据制定优化方案。

Oracle AWR自动工作负载仓库性能诊断修改时间:2026-08-25 19:43:11

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。