Skip to content

Oracle AWR 和 ASH 报告分析

生成 AWR 报告

使用 SQL*Plus 生成

sql
-- 连接到数据库
sqlplus / as sysdba

-- 运行 AWR 报告生成脚本
@?/rdbms/admin/awrrpt.sql

-- 选择报告格式(html 或 txt)
Enter value for report_type: html

-- 选择天数范围
Enter value for num_days: 1

-- 选择开始快照 ID
Enter value for begin_snap:

-- 选择结束快照 ID
Enter value for end_snap:

-- 输入报告文件名
Enter value for report_name: awr_report_1_2.html

使用 Enterprise Manager 生成

  1. 登录 Oracle Enterprise Manager
  2. 导航到 "性能" 选项卡
  3. 点击 "AWR 报告"
  4. 选择时间范围和快照
  5. 点击 "生成报告"

生成特定类型的 AWR 报告

sql
-- 生成单实例 AWR 报告
@?/rdbms/admin/awrrpt.sql

-- 生成 RAC 数据库的全局 AWR 报告
@?/rdbms/admin/awrgrpt.sql

-- 生成 RAC 数据库的节点级 AWR 报告
@?/rdbms/admin/awrrpti.sql

-- 生成 AWR 比较报告
@?/rdbms/admin/awrddrpt.sql

生成 ASH 报告

使用 SQL*Plus 生成

sql
-- 连接到数据库
sqlplus / as sysdba

-- 运行 ASH 报告生成脚本
@?/rdbms/admin/ashrpt.sql

-- 选择报告格式(html 或 txt)
Enter value for report_type: html

-- 选择天数范围
Enter value for num_days: 1

-- 选择开始时间
Enter value for begin_time:

-- 选择结束时间
Enter value for duration:

-- 输入报告文件名
Enter value for report_name: ash_report.html

使用 Enterprise Manager 生成

  1. 登录 Oracle Enterprise Manager
  2. 导航到 "性能" 选项卡
  3. 点击 "ASH 报告"
  4. 选择时间范围
  5. 点击 "生成报告"

AWR 报告分析

报告结构

  1. 报告标题:包含数据库名称、实例、时间范围等基本信息
  2. 摘要部分:包括 DB Time、DB CPU、等待事件摘要等
  3. Top 5 等待事件:最主要的等待事件
  4. SQL 统计信息:包括 Top SQL 语句
  5. 实例效率百分比:缓存命中率、软解析率等
  6. 内存统计信息:SGA、PGA 使用情况
  7. I/O 统计信息:数据文件 I/O 情况
  8. 详细等待事件:所有等待事件的详细信息
  9. 段统计信息:热点段分析
  10. 初始化参数:数据库参数设置

关键指标分析

DB Time 和 DB CPU

  • DB Time:数据库总工作时间,包括 CPU 时间和等待时间
  • DB CPU:数据库 CPU 时间
  • DB Time/Elapsed Time:数据库负载指数,理想值为 CPU 核心数

等待事件分析

  • Top 5 等待事件:识别主要瓶颈
  • 等待事件比率:各类等待事件占比
  • 等待时间:平均等待时间和总等待时间

SQL 语句分析

  • Top SQL by Elapsed Time:执行时间最长的 SQL
  • Top SQL by CPU Time:CPU 消耗最多的 SQL
  • Top SQL by Logical Reads:逻辑读最多的 SQL
  • Top SQL by Physical Reads:物理读最多的 SQL

实例效率分析

  • Buffer Cache Hit Ratio:缓冲区缓存命中率,理想值 > 95%
  • Library Cache Hit Ratio:库缓存命中率,理想值 > 99%
  • Soft Parse Ratio:软解析率,理想值 > 95%
  • Execute to Parse Ratio:执行与解析比率,理想值 > 90%

ASH 报告分析

报告结构

  1. 报告标题:包含数据库名称、实例、时间范围等基本信息
  2. 摘要部分:包括采样时间、会话数、等待事件摘要等
  3. Top 等待事件:最主要的等待事件
  4. Top SQL 语句:消耗资源最多的 SQL
  5. Top 会话:活动最频繁的会话
  6. Top 阻塞者:造成阻塞的会话
  7. 等待事件详细信息:各类等待事件的详细分布

关键指标分析

等待事件分布

  • 等待事件类型:CPU、I/O、锁等不同类型的等待
  • 等待事件占比:各类等待事件的百分比
  • 等待时长:平均等待时间和总等待时间

SQL 语句分析

  • Top SQL by Event:按事件分类的 Top SQL
  • Top SQL by Duration:持续时间最长的 SQL
  • Top SQL by CPU:CPU 消耗最多的 SQL

会话分析

  • Top Sessions:活动最频繁的会话
  • Session Details:会话的详细活动情况
  • Blocking Sessions:造成阻塞的会话

性能问题诊断流程

1. 收集性能数据

  • 生成 AWR 报告(长期趋势分析)
  • 生成 ASH 报告(实时问题诊断)
  • 收集系统级性能数据

2. 分析性能瓶颈

  • 识别主要等待事件:从 Top 5 等待事件开始分析
  • 定位问题 SQL:分析 Top SQL 语句
  • 检查资源使用:CPU、内存、I/O 等资源使用情况
  • 分析实例效率:缓存命中率、解析率等指标

3. 确定问题原因

  • 等待事件分析:根据等待事件类型确定问题原因
  • SQL 语句分析:检查执行计划、绑定变量使用等
  • 系统资源分析:检查系统级资源瓶颈
  • 配置参数分析:检查数据库参数设置

4. 实施解决方案

  • SQL 优化:重写 SQL、创建索引、调整执行计划
  • 参数调整:修改数据库参数
  • 资源调整:增加系统资源、优化存储
  • 应用优化:调整应用程序逻辑

5. 验证解决方案

  • 生成新的性能报告
  • 比较优化前后的性能指标
  • 确认问题是否解决
  • 监控长期性能趋势

常见性能问题分析

1. I/O 瓶颈

症状

  • Top 等待事件包含 "db file sequential read"、"db file scattered read"
  • 物理读次数高,I/O 等待时间长
  • 缓冲区缓存命中率低

解决方案

  • 优化 SQL 语句,减少物理读
  • 创建合适的索引,减少全表扫描
  • 调整 DB_CACHE_SIZE 参数
  • 优化存储系统,提高 I/O 性能

2. CPU 瓶颈

症状

  • Top 等待事件包含 "CPU time"
  • DB CPU 占比高
  • 系统 CPU 使用率接近 100%

解决方案

  • 优化 CPU 密集型 SQL 语句
  • 减少硬解析,使用绑定变量
  • 调整 SHARED_POOL_SIZE 参数
  • 考虑增加 CPU 资源

3. 锁和阻塞

症状

  • Top 等待事件包含 "enqueue"、"row lock contention"
  • ASH 报告显示阻塞会话
  • 事务执行时间长

解决方案

  • 优化事务逻辑,减少锁定时间
  • 使用适当的隔离级别
  • 检查并终止长时间运行的事务
  • 调整应用程序逻辑,避免死锁

4. 内存瓶颈

症状

  • 大量的 PGA 内存使用
  • 排序操作使用临时表空间
  • 游标溢出到磁盘

解决方案

  • 调整 PGA_AGGREGATE_TARGET 参数
  • 优化排序操作,减少排序量
  • 使用适当的索引,避免排序
  • 考虑增加内存资源

AWR 和 ASH 报告最佳实践

报告生成

  • 选择合适的时间范围:避免生成过长或过短的报告
  • 对比报告:使用 AWR 比较报告分析性能变化
  • 定期生成:建立定期生成报告的机制
  • 保存历史报告:便于趋势分析和问题追溯

分析技巧

  • 关注变化:对比不同时间点的报告,关注指标变化
  • 从宏观到微观:先看摘要,再深入分析具体问题
  • 综合分析:结合 AWR、ASH 和系统级数据进行分析
  • 关注比例:不仅看绝对值,还要看相对比例

自动化

  • 自动生成报告:使用脚本定期生成性能报告
  • 自动分析:使用工具自动分析报告中的异常
  • 自动告警:设置性能指标阈值,超过阈值时告警
  • 性能趋势:建立性能趋势分析系统

常见问题(FAQ)

Q1: AWR 和 ASH 报告有什么区别?

A1: AWR 报告是基于每小时收集的快照数据生成的,适用于长期性能趋势分析和整体性能评估。ASH 报告是基于每秒采样的活动会话数据生成的,适用于实时性能问题诊断和短期性能异常分析。

Q2: 如何确定生成 AWR 报告的最佳时间范围?

A2: 应根据问题的持续时间和严重程度确定。对于短期问题,选择 1-2 小时的时间范围;对于长期趋势分析,选择 1 天或更长时间;对于性能对比,选择相同工作负载的时间段。

Q3: 如何分析 AWR 报告中的 Top SQL 语句?

A3: 分析 Top SQL 语句时,应关注:

  • 执行计划是否合理
  • 是否使用了绑定变量
  • 是否有合适的索引
  • 是否可以重写 SQL 语句
  • 是否存在全表扫描或其他低效操作

Q4: 如何解决 "db file sequential read" 等待事件?

A4: "db file sequential read" 通常表示单块读取操作慢,常见于索引扫描。解决方案包括:

  • 优化 SQL 语句,减少索引扫描次数
  • 检查索引是否合理,考虑创建或重建索引
  • 优化存储系统,提高随机 I/O 性能
  • 调整 DB_CACHE_SIZE 参数

Q5: 如何使用 ASH 报告诊断实时性能问题?

A5: 使用 ASH 报告诊断实时性能问题时:

  • 关注 Top 等待事件,识别瓶颈
  • 查看 Top 会话,找到活动最频繁的会话
  • 分析 Top SQL,定位消耗资源最多的 SQL
  • 检查阻塞者,识别造成阻塞的会话
  • 结合系统级数据,综合分析问题原因