Skip to content

Oracle ASH 报告分析

ASH 报告简介

ASH(Active Session History)是 Oracle 数据库的活动会话历史功能,它会以秒为单位采样收集活动会话的详细信息,并存储在内存和 AWR 仓库中。ASH 报告提供了实时的数据库性能视图,是 DBA 进行实时性能监控和问题诊断的重要工具。

ASH 报告的主要特点

  • 实时性:提供近实时的数据库性能数据
  • 细粒度:以秒为单位采样,捕捉短期性能问题
  • 详细信息:记录活动会话的等待事件、SQL 语句、绑定变量等详细信息
  • 内存存储:采样数据首先存储在内存中,然后定期刷新到 AWR
  • 关联分析:可以与 AWR 报告结合使用,提供更全面的性能分析

ASH 报告与 AWR 报告的区别

特性ASH 报告AWR 报告
数据粒度秒级分钟级
数据存储主要在内存,部分在 AWR存储在 AWR 仓库
分析范围短期性能问题长期性能趋势
详细程度非常详细,包含会话级信息汇总信息,统计级别
生成速度快速相对较慢
适用场景实时监控、短期问题诊断性能趋势分析、长期问题诊断

生成 ASH 报告

使用 ashrpt.sql 脚本

sql
-- 在 SQL*Plus 中执行
@$ORACLE_HOME/rdbms/admin/ashrpt.sql

-- 按提示输入:
-- 1. 报告格式(html 或 text)
-- 2. 开始时间(例如:10:00:00)
-- 3. 结束时间(例如:10:30:00)
-- 4. 报告文件名

使用 ashrpti.sql 脚本(指定实例)

sql
-- 在 RAC 环境中指定实例生成报告
@$ORACLE_HOME/rdbms/admin/ashrpti.sql

-- 按提示输入:
-- 1. 报告格式
-- 2. 数据库 ID
-- 3. 实例 ID
-- 4. 开始时间
-- 5. 结束时间
-- 6. 报告文件名

使用 Enterprise Manager

  1. 登录 Oracle Enterprise Manager
  2. 导航到 "性能" → "性能报告"
  3. 选择 "ASH 报告"
  4. 设置时间范围和其他参数
  5. 点击 "生成报告"

使用 DBMS_WORKLOAD_REPOSITORY 包

sql
-- 查看 ASH 数据
SELECT sample_id, sample_time, session_id, session_serial#, 
       sql_id, wait_class, event
FROM v$active_session_history
ORDER BY sample_time DESC;

-- 从 AWR 中查看 ASH 数据
SELECT sample_id, sample_time, session_id, session_serial#, 
       sql_id, wait_class, event
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN SYSDATE-1/24 AND SYSDATE
ORDER BY sample_time DESC;

ASH 报告分析方法

1. 报告头部信息分析

关注要点

  • 报告时间范围
  • 数据库版本和实例信息
  • 采样时间间隔
  • 活动会话数量

分析技巧

  • 确认报告覆盖了性能问题发生的时间段
  • 注意活动会话数量的变化,判断负载程度

2. 等待事件分析

关注区域

  • Top User Events:用户会话的主要等待事件
  • Top Background Events:后台进程的主要等待事件
  • Wait Events by Time:按时间排序的等待事件
  • Wait Events by Count:按发生次数排序的等待事件

分析技巧

  • 首先关注排名靠前的等待事件
  • 分析等待事件的类型和原因
  • 结合其他部分的信息进行综合判断

3. SQL 语句分析

关注区域

  • Top SQL by Elapsed Time:按执行时间排序的 SQL
  • Top SQL by CPU Time:按 CPU 时间排序的 SQL
  • Top SQL by User I/O Wait Time:按用户 I/O 等待时间排序的 SQL
  • Top SQL by Application Wait Time:按应用等待时间排序的 SQL
  • Top SQL by Cluster Wait Time:按集群等待时间排序的 SQL
  • Top SQL by Concurrency Wait Time:按并发等待时间排序的 SQL

分析技巧

  • 重点关注消耗资源最多的 SQL 语句
  • 分析 SQL 语句的执行计划
  • 检查 SQL 语句的绑定变量值
  • 结合等待事件分析 SQL 性能问题

4. 会话分析

关注区域

  • Top Sessions:消耗资源最多的会话
  • Sessions by Wait Class:按等待类分类的会话
  • Session Details:会话详细信息

分析技巧

  • 识别消耗资源最多的会话
  • 分析会话的等待模式
  • 检查会话的 SQL 语句和执行计划
  • 确定是否存在异常会话

5. 服务和模块分析

关注区域

  • Top Services:按资源消耗排序的服务
  • Top Modules:按资源消耗排序的模块
  • Top Actions:按资源消耗排序的操作

分析技巧

  • 识别消耗资源最多的服务和模块
  • 分析不同服务和模块的性能特征
  • 确定是否存在特定服务或模块的性能问题

6. 时间模型分析

关注区域

  • DB Time Breakdown:数据库时间分解
  • Foreground vs Background:前台进程 vs 后台进程

分析技巧

  • 分析数据库时间的分布情况
  • 确定主要的时间消耗来源
  • 评估前台进程和后台进程的资源消耗比例

7. 阻塞分析

关注区域

  • Blockers:阻塞会话信息
  • Blocked Sessions:被阻塞会话信息

分析技巧

  • 识别阻塞源和被阻塞的会话
  • 分析阻塞的原因和持续时间
  • 采取措施解除阻塞

8. PL/SQL 分析

关注区域

  • Top PL/SQL by Elapsed Time:按执行时间排序的 PL/SQL 程序
  • Top PL/SQL by CPU Time:按 CPU 时间排序的 PL/SQL 程序

分析技巧

  • 识别消耗资源最多的 PL/SQL 程序
  • 分析 PL/SQL 程序的性能问题
  • 优化 PL/SQL 代码

ASH 报告分析实例

分析步骤

  1. 生成 ASH 报告:在性能问题发生时生成报告
  2. 分析等待事件:识别主要性能瓶颈
  3. 分析 SQL 语句:找出消耗资源最多的 SQL
  4. 分析会话信息:识别异常会话
  5. 综合分析:结合所有信息进行综合判断
  6. 制定优化方案:根据分析结果制定优化策略

案例分析

场景:数据库突然响应缓慢,用户无法正常操作

ASH 报告分析

  1. 等待事件分析

    • Top 1: enqueue (Wait Time: 65%)
    • Top 2: db file sequential read (Wait Time: 20%)
    • Top 3: buffer busy waits (Wait Time: 10%)
  2. SQL 语句分析

    • 发现一个 UPDATE 语句消耗了 70% 的 elapsed time
    • 该 SQL 正在更新一个大型表,没有使用索引
  3. 会话分析

    • 发现会话 ID 123 正在执行上述 UPDATE 语句
    • 该会话阻塞了 15 个其他会话
  4. 阻塞分析

    • 会话 123 持有排他锁
    • 被阻塞的会话正在等待该锁释放

优化方案

  1. 终止会话 123 的长时间运行的 UPDATE 语句
  2. 为 UPDATE 语句的 WHERE 条件添加合适的索引
  3. 考虑分批更新大型表,避免长时间持有锁
  4. 监控类似的长时间运行的语句

ASH 报告的高级使用

1. 实时 ASH 分析

使用 V$ACTIVE_SESSION_HISTORY 视图

sql
-- 实时查看活动会话
SELECT sample_time, session_id, session_serial#, 
       sql_id, wait_class, event, 
       current_obj#
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/1440  -- 最近 1 分钟
ORDER BY sample_time DESC;

-- 查看等待事件分布
SELECT wait_class, event, COUNT(*)
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/1440
GROUP BY wait_class, event
ORDER BY COUNT(*) DESC;

-- 查看消耗 CPU 最多的 SQL
SELECT sql_id, COUNT(*)
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/1440
  AND wait_class = 'CPU'
GROUP BY sql_id
ORDER BY COUNT(*) DESC;

2. ASH 数据挖掘

使用 DBA_HIST_ACTIVE_SESS_HISTORY 视图

sql
-- 查看历史 ASH 数据
SELECT sample_time, session_id, session_serial#, 
       sql_id, wait_class, event
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN SYSDATE-1 AND SYSDATE
  AND wait_class NOT IN ('Idle')
ORDER BY sample_time DESC;

-- 分析特定时间段的性能问题
SELECT wait_class, event, COUNT(*)
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN TO_DATE('2026-01-28 10:00:00', 'YYYY-MM-DD HH24:MI:SS') 
                      AND TO_DATE('2026-01-28 10:30:00', 'YYYY-MM-DD HH24:MI:SS')
  AND wait_class NOT IN ('Idle')
GROUP BY wait_class, event
ORDER BY COUNT(*) DESC;

-- 分析特定 SQL 的性能
SELECT sample_time, wait_class, event, 
       current_obj#, blocking_session
FROM dba_hist_active_sess_history
WHERE sql_id = 'abc123'
  AND sample_time BETWEEN SYSDATE-1 AND SYSDATE
ORDER BY sample_time;

3. ASH 报告与其他工具结合使用

与 ADDM 结合

  • ADDM 会自动分析 ASH 数据并提供优化建议
  • 优先考虑 ADDM 建议的优化措施

与 SQL Tuning Advisor 结合

  • 对于 ASH 报告中识别的高消耗 SQL,使用 SQL Tuning Advisor 进行优化
  • SQL Tuning Advisor 会分析 SQL 语句并提供具体的优化建议

与 AWR 报告结合

  • 使用 ASH 报告分析短期性能问题
  • 使用 AWR 报告分析长期性能趋势
  • 结合两者提供更全面的性能分析

4. 自定义 ASH 报告

使用 DBMS_WORKLOAD_REPOSITORY 包

sql
-- 创建自定义 ASH 报告
EXEC DBMS_WORKLOAD_REPOSITORY.create_ash_report(
  begin_time => SYSDATE - 1/24,
  end_time => SYSDATE,
  report_type => 'HTML',
  report_name => 'custom_ash_report.html'
);

-- 查看自定义报告
SELECT DBMS_WORKLOAD_REPOSITORY.get_ash_report(
  begin_time => SYSDATE - 1/24,
  end_time => SYSDATE,
  report_type => 'TEXT'
) FROM dual;

使用 SQL 生成自定义分析

sql
-- 生成等待事件热力图数据
SELECT TO_CHAR(sample_time, 'HH24:MI') AS time_slot,
       wait_class,
       COUNT(*) AS wait_count
FROM v$active_session_history
WHERE sample_time > SYSDATE - 2/24  -- 最近 2 小时
  AND wait_class NOT IN ('Idle')
GROUP BY TO_CHAR(sample_time, 'HH24:MI'), wait_class
ORDER BY time_slot, wait_count DESC;

-- 生成 SQL 性能趋势
SELECT TO_CHAR(sample_time, 'HH24:MI') AS time_slot,
       sql_id,
       COUNT(*) AS sample_count
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/24
  AND sql_id IS NOT NULL
GROUP BY TO_CHAR(sample_time, 'HH24:MI'), sql_id
ORDER BY time_slot, sample_count DESC;

ASH 报告优化策略

1. 实时性能监控

  • 设置自动 ASH 报告:定期生成 ASH 报告,监控性能变化
  • 使用 Enterprise Manager:利用 EM 的实时监控功能
  • 创建自定义监控脚本:基于 V$ACTIVE_SESSION_HISTORY 视图创建监控脚本
  • 设置性能告警:当特定等待事件超过阈值时触发告警

2. 快速问题诊断

  • 及时生成 ASH 报告:在性能问题发生时立即生成报告
  • 分析等待事件:快速识别主要性能瓶颈
  • 定位问题会话:使用 ASH 数据定位问题会话
  • 分析 SQL 语句:找出消耗资源最多的 SQL

3. SQL 优化

  • 识别问题 SQL:通过 ASH 报告识别高消耗 SQL
  • 分析执行计划:查看 SQL 的执行计划
  • 使用绑定变量:减少硬解析
  • 添加索引:为高频查询添加合适的索引
  • 重写 SQL 语句:优化复杂 SQL 的结构

4. 资源管理

  • 识别资源瓶颈:通过 ASH 报告识别 CPU、I/O、内存等资源瓶颈
  • 调整资源分配:根据 ASH 分析结果调整资源分配
  • 优化内存使用:分析内存相关的等待事件,调整内存参数
  • 优化 I/O 性能:分析 I/O 相关的等待事件,优化存储配置

5. 并发控制

  • 识别锁争用:通过 ASH 报告识别锁争用问题
  • 分析阻塞链:找出阻塞源和被阻塞的会话
  • 优化事务设计:减少事务长度,避免长时间持有锁
  • 使用适当的隔离级别:根据业务需求选择合适的事务隔离级别

6. 系统调优

  • 分析系统级等待事件:如 log file sync、buffer busy waits 等
  • 调整系统参数:根据 ASH 分析结果调整系统参数
  • 优化存储配置:改善 I/O 性能
  • 调整并行度:根据 ASH 数据调整并行执行参数

常见问题(FAQ)

Q1: ASH 报告中的数据保留多长时间?

A1: ASH 数据的保留时间取决于以下因素:

  • 内存中的 ASH 数据:通常保留约 1 小时,具体取决于数据库活动和内存大小
  • AWR 中的 ASH 数据:与 AWR 数据的保留时间相同,默认为 7 天
  • 可以通过修改 AWR 保留时间来调整:使用 DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS 过程

Q2: 如何确定 ASH 报告的时间范围?

A2: 确定 ASH 报告时间范围的方法:

  • 问题发生时间:确保报告覆盖性能问题发生的时间段
  • 时间长度:一般选择 5-30 分钟的时间段,太短可能无法捕捉到问题,太长可能包含过多无关信息
  • 采样密度:ASH 报告的时间范围越短,数据越详细

Q3: 如何分析 ASH 报告中的 "enqueue" 等待事件?

A3: 分析 "enqueue" 等待事件的方法:

  • 确定锁类型:查看等待事件的详细信息,确定锁的类型
  • 查找阻塞源:在阻塞分析部分查找阻塞会话
  • 分析 SQL 语句:查看阻塞会话正在执行的 SQL 语句
  • 采取措施:根据具体情况,可能需要终止阻塞会话或优化 SQL 语句

Q4: 如何使用 ASH 报告识别 CPU 瓶颈?

A4: 识别 CPU 瓶颈的方法:

  • 查看等待事件:CPU 瓶颈通常表现为 "CPU time" 或 "busy CPU" 等待
  • 分析 SQL 语句:查看消耗 CPU 最多的 SQL 语句
  • 检查会话:查看消耗 CPU 最多的会话
  • 分析 PL/SQL:检查消耗 CPU 最多的 PL/SQL 程序

Q5: ASH 报告中的 "buffer busy waits" 等待事件如何解决?

A5: 解决 "buffer busy waits" 等待事件的方法:

  • 原因分析
    • 热点块竞争
    • 段头竞争
    • 回滚段竞争
  • 解决方法
    • 对于热点块:使用更小的块大小,或考虑分区
    • 对于段头竞争:增加 FREELISTS 和 FREELIST GROUPS
    • 对于回滚段竞争:确保有足够的回滚段
    • 使用自动段空间管理(ASSM)

Q6: 如何使用 ASH 报告监控数据库的实时性能?

A6: 监控实时性能的方法:

  • 定期生成 ASH 报告:例如每 15 分钟生成一次
  • 使用实时 ASH 视图:查询 V$ACTIVE_SESSION_HISTORY 视图
  • 创建监控脚本:基于 ASH 数据创建自定义监控脚本
  • 设置性能告警:当特定指标超过阈值时触发告警

Q7: 如何分析 ASH 报告中的 "db file sequential read" 等待事件?

A7: 分析 "db file sequential read" 等待事件的方法:

  • 原因分析
    • 索引扫描
    • 回滚段读取
    • 数据字典读取
  • 解决方法
    • 检查索引使用情况,确保使用了合适的索引
    • 优化 SQL 语句,减少索引扫描的范围
    • 考虑使用索引组织表(IOT)
    • 检查存储性能,确保 I/O 子系统性能良好

Q8: 如何使用 ASH 报告评估优化措施的效果?

A8: 评估优化措施效果的方法:

  • 生成优化前后的 ASH 报告:在相同的负载条件下生成报告
  • 比较关键指标
    • 等待事件分布的变化
    • 高消耗 SQL 的性能变化
    • 会话等待时间的变化
    • 资源使用率的变化
  • 分析趋势:观察优化措施实施后的性能趋势
  • 综合评估:结合业务指标(如响应时间、吞吐量)进行综合评估