前言
做 DBA 的都知道,AWR 报告是排查数据库性能问题的神器。但你有没有遇到过这种情况:业务部门反映某个接口很慢,你抓了一份标准 AWR 报告,翻来覆去却找不到原因?
问题:标准 AWR 的盲区
标准 AWR 报告是全局视角,它只会展示整个数据库中"最慢的那些 SQL"。但这就会导致两个经典问题:
问题一:高频 SQL 隐形
某条 SQL 单次执行只要 5ms,不算慢。但它每秒钟被调用 1000 次,累积起来就是 5 秒/秒。这种 SQL 在标准 AWR 里根本挤不进 Top 10,但它恰恰可能是瓶颈所在。
问题二:业务模块混杂
你的数据库可能跑了几十个应用,订单系统、报表系统、后台任务全混在一起。某个应用的 SQL 问题,很可能被其他应用的噪音淹没。
你说能不能按应用筛选?19C 时代这个问题基本无解。虽然可以用 DBMS_APPLICATION_INFO.SET_MODULE 打标签,但:
- 需要应用代码配合修改
- 没有原生生成独立应用级 AWR 报告的功能
- 只能在全局报告里"人工找"相关 SQL
这个问题困扰了 DBA 很多年,直到 Oracle 26ai。
26ai 新特性:DBMS_AWRAPP
Oracle 26ai 推出了两个新包,专门解决应用级 AWR 的问题:
| 包 | 功能 |
|---|---|
DBMS_AWRAPP | 生成应用级 AWR 报告 |
DBMS_AWRAPP_ADMIN | 管理 APPMAP:创建、删除、跟踪开关 |
核心优势
- 不需要应用提前打标签:用 pattern 匹配自动归类 session;
- pattern 灵活匹配:支持 MODULE、ACTION、CLIENT_INFO、CLIENT_IDENTIFIER 四个维度;
- 独立报告:生成的报告只包含目标应用的 SQL,排除干扰;
常用命令
1. 开启应用级 AWR 收集
BEGIN
DBMS_WORKLOAD_REPOSITORY.ENABLE_AWRAPP_SNAPSHOT;
END;
/
2. 创建应用地图(APPMAP)
BEGIN
DBMS_AWRAPP_ADMIN.CREATE_APPMAP(
appmap_name => '订单系统',
module_pat => '%订单%', -- 匹配 MODULE
action_pat => '%', -- 任意 ACTION
client_info_pat => '%',
client_identifier_pat => '%');
END;
/
参数说明:
| 参数 | 匹配字段 | 示例 |
|---|---|---|
module_pat | V$SESSION.MODULE | %订单% 匹配"订单中心"、"订单查询" |
action_pat | V$SESSION.ACTION | %查询% 匹配"查询订单"、"查询用户" |
client_info_pat | V$SESSION.CLIENT_INFO | %CRM% 匹配 CRM 相关 |
client_identifier_pat | V$SESSION.CLIENT_IDENTIFIER | %租户A% 匹配特定租户 |
3. 开启/停止跟踪
-- 开启跟踪
BEGIN
DBMS_AWRAPP_ADMIN.INCLUDE_APPMAP(appmap_name => '订单系统');
END;
/
-- 停止跟踪
BEGIN
DBMS_AWRAPP_ADMIN.EXCLUDE_APPMAP(appmap_name => '订单系统');
END;
/
4. 生成报告
-- 查看快照 ID
SELECT snap_id,
begin_interval_time,
end_interval_time
FROM dba_hist_snapshot
WHERE begin_time > SYSDATE - 1
ORDER BY snap_id DESC;
-- 生成报告(支持 HTML/TEXT/JSON)
SPOOL awrapp_report.html
SELECT DBMS_AWRAPP.GENERATE_AWRAPP_REPORT(
dbid => (SELECT dbid FROM v$database),
beg_snap => 185,
end_snap => 190,
inst_val => '1',
format => 'HTML'
) FROM dual;
SPOOL OFF
5. 管理操作
-- 查看所有 APPMAP
SELECT * FROM dba_awrapp_appmap_def;
-- 查看跟踪状态
SELECT * FROM dba_awrapp_appmap_control;
-- 查看应用 SQL 统计
SELECT * FROM dba_awrapp_sqlstat;
-- 删除 APPMAP
BEGIN
DBMS_AWRAPP_ADMIN.DROP_AWRAPP(appmap_name => '订单系统');
END;
/
使用场景
场景一:高频低耗时 SQL 排查
某个接口很慢,但标准 AWR 找不到原因。可能是一条执行很快(1ms)但调用频率极高(100 万次/小时)的 SQL,应用级 AWR 可以把它揪出来。
场景二:特定业务模块性能分析
你想单独分析"订单模块"的 SQL 性能,不需要关心"报表模块"在跑什么。用 APPMAP 过滤后,报告里全是订单相关的 SQL。
场景三:多租户环境性能隔离
SaaS 系统可能有多个租户共享数据库,想看某个特定租户的性能表现。用 client_identifier_pat 匹配租户 ID,单独分析。
场景四:问题时段回溯
某个时间段接口慢了,事后想分析那个时段的应用级性能。等快照收集完,直接生成对应时间段的报告。
报告内容
应用级 AWR 报告包含以下内容:
- 报告头部:时间范围、DB 信息;
- 应用信息:该应用的总体统计(SQL 执行次数、耗时、等待事件等);
- Top SQL:该应用中最耗时的 SQL;
- SQL 详情:执行计划、统计信息;
19C ~ 23ai 写法
如果你是 26ai 之前的版本,没有 DBMS_AWRAPP 包,可以尝试:
- 让应用设置 MODULE:
DBMS_APPLICATION_INFO.SET_MODULE; - ASH 分析:
V$ACTIVE_SESSION_HISTORY按 MODULE 字段过滤; - 手动分析:生成 AWR 报告后,人工筛选相关 SQL;
写在最后
DBMS_AWRAPP 是 Oracle 26ai 给 DBA 的一个大礼包。
以前我们做应用级性能分析,几乎没有好用的工具。现在好了,一个 APPMAP 定义,自动帮你归类 session,生成的报告干净利落。
- 标准 AWR:放大镜,看全局
- 应用级 AWR:显微镜,看局部
两者配合,才能真正把性能问题看得清清楚楚。
建议还没升级 26ai 的同学可以考虑了,这个功能确实香。
📚 推荐阅读:DBA 学习之路
如果这篇文章对你有帮助,推荐访问我的 Oracle DBA 系统学习站点,涵盖 100 天完整学习路线:
- 🔧 Oracle 安装部署 · RMAN 备份恢复 · Data Pump 数据迁移
- 🏗️ RAC 高可用 · DataGuard 容灾 · 多租户架构
- 🔍 故障排查 · 升级迁移 · GoldenGate 数据同步