Oracle Maclean ASH 实战分析
Oracle Maclean ASH 实战分析
来源:Maclean Liu (刘相兵) / oradb.me 适用版本:Oracle Database 10g+ 文档版本:v1.0 / 2026-07-22
1. 概述
ASH 是 Maclean 性能诊断的核心工具[1]。
详细见:Oracle ASH 性能分析实战。
2. ASH 基础
2.1 采样
- 每秒采样活跃会话
- 内存(v$active_session_history)
- 持久化(wrh$_active_session_history)
2.2 优势
- 实时
- 历史
- 细粒度
- 短查询捕获
2.3 Maclean 观点
- ASH 是性能诊断瑞士军刀
- 实时 + 历史
- 关键工具
3. 实时分析
3.1 当前活跃
SELECT sid, serial#, session_id, event, sql_id, wait_class
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
ORDER BY sample_time DESC;
3.2 TOP 等待
SELECT event, wait_class, count(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY event, wait_class
ORDER BY samples DESC;
3.3 TOP SQL
SELECT sql_id, count(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24 AND sql_id IS NOT NULL
GROUP BY sql_id
ORDER BY samples DESC;
4. 历史分析
4.1 dba_hist_active_sess_history
SELECT event, count(*)
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN
TO_DATE('2026-07-22 10:00','YYYY-MM-DD HH24:MI') AND
TO_DATE('2026-07-22 11:00','YYYY-MM-DD HH24:MI')
GROUP BY event ORDER BY count(*) DESC;
4.2 时间段
-- 找出问题时段
SELECT TO_CHAR(sample_time,'YYYY-MM-DD HH24:MI'), count(*)
FROM dba_hist_active_sess_history
WHERE sample_time > SYSDATE-1
GROUP BY TO_CHAR(sample_time,'YYYY-MM-DD HH24:MI')
ORDER BY 1;
4.3 Maclean 方法
- 找高峰
- 聚焦分析
- 关联 SQL
5. 会话分析
5.1 TOP 会话
SELECT session_id, session_serial#, user_id, count(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY session_id, session_serial#, user_id
ORDER BY samples DESC;
5.2 用户
SELECT u.username, count(*) AS samples
FROM v$active_session_history h, dba_users u
WHERE h.user_id = u.user_id
AND h.sample_time > SYSDATE-1/24
GROUP BY u.username
ORDER BY samples DESC;
5.3 模块
SELECT module, action, count(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY module, action
ORDER BY samples DESC;
6. SQL 分析
6.1 SQL 文本
SELECT sql_text FROM v$sql WHERE sql_id='&sql_id';
6.2 执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id'));
6.3 历史执行
SELECT snap_id, plan_hash_value, executions, elapsed_time
FROM dba_hist_sqlstat WHERE sql_id='&sql_id';
6.4 Maclean 分析
- 找出 SQL
- 看执行计划
- 优化
7. 等待事件分析
7.1 P1/P2/P3
SELECT event, p1, p2, p3, count(*)
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
AND event = '&event'
GROUP BY event, p1, p2, p3;
7.2 定位对象
-- db file sequential read
SELECT owner, segment_name
FROM dba_extents
WHERE file_id = &p1 AND &p2 BETWEEN block_id AND block_id+blocks-1;
7.3 Maclean 方法
- 等待事件
- P1/P2/P3
- 定位对象
- 优化
8. 阻塞分析
8.1 阻塞链
SELECT session_id, blocking_session, event, sql_id
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
AND blocking_session IS NOT NULL;
8.2 阻塞者
SELECT blocking_session, count(*)
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
AND blocking_session IS NOT NULL
GROUP BY blocking_session ORDER BY count(*) DESC;
8.3 Maclean 分析
- 找阻塞者
- 终止(必要时)
- 优化应用
9. TOP SQL
9.1 CPU 消耗
SELECT sql_id, count(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
AND wait_class = 'CPU'
GROUP BY sql_id ORDER BY samples DESC;
9.2 I/O 等待
SELECT sql_id, count(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
AND wait_class IN ('User I/O','System I/O')
GROUP BY sql_id ORDER BY samples DESC;
10. ASH 报告
10.1 生成
@?/rdbms/admin/ashrpt.sql
10.2 内容
- TOP SQL
- TOP 等待
- TOP 会话
- 阻塞
- 活动
10.3 Maclean 推荐
- 问题时段
- 定向分析
- 关键工具
11. 案例:CPU 飙高
11.1 现象
- CPU 100%
- 应用慢
11.2 Maclean 诊断
SELECT sql_id, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24 AND wait_class='CPU'
GROUP BY sql_id ORDER BY count(*) DESC;
11.3 优化
- TOP SQL
- 加索引/绑定变量
- 验证
12. 案例:间歇慢
12.1 现象
- 偶发慢
- 难复现
12.2 Maclean 诊断
- 历史 ASH
- 找慢时段
- 关联 SQL
12.3 优化
- 锁等待
- 长事务
- 优化
13. 案例:I/O 高
13.1 现象
- 磁盘 I/O 高
- db file scattered read
13.2 Maclean 诊断
SELECT sql_id, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24 AND event='db file scattered read'
GROUP BY sql_id ORDER BY count(*) DESC;
13.3 优化
- 全表扫描
- 加索引
- 分区
14. Maclean ASH 脚本集
14.1 常用
-- 实时 TOP 等待
SELECT event, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY event ORDER BY count(*) DESC;
-- 实时 TOP SQL
SELECT sql_id, count(*) FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24
GROUP BY sql_id ORDER BY count(*) DESC;
-- 阻塞链
SELECT session_id, blocking_session, event
FROM v$active_session_history
WHERE sample_time > SYSDATE-1/24 AND blocking_session IS NOT NULL;
14.2 工具
- ashrpt.sql
- 自定义脚本
- OEM
15. 最佳实践
- 实时:v$active_session_history
- 历史:dba_hist_active_sess_history
- TOP:聚焦
- SQL:关联
- 阻塞:分析
- P1/P2/P3:定位
- 报告:ashrpt
- 案例:学习
- 监控:持续
- 原理:理解
16. 参考资料
[1] Maclean Liu, “ASH 实战”, https://oradb.me [2] Oracle Database Performance Tuning Guide 19c