不能,dbms_sqltune.report_awr生成的是awr报告中的sql性能分析摘要,不含执行计划图、io/cpu分解等监控细节;查历史sql完整监控报告须用dbms_perf.report_sql_monitor。
dbms_sqltune.report_awr 能不能直接生成历史 sql 监控报告?
不能。这是最常见的误解——dbms_sqltune.report_awr 生成的是 **awr 报告中的 sql 性能分析部分**(即 sql tuning advisor 风格的诊断),不是 sql monitoring report(sql 实时/历史监控视图)。后者带执行计划图、并行分布、io/cpu 时间分解、绑定变量快照等,而 report_awr 输出的是文本摘要,不含实时采样细节。
想查历史 SQL 的完整监控报告,该用哪个函数?
Oracle 12c 及以后(含 19c)必须用 DBMS_PERF.REPORT_SQL_MONITOR,且需指定 type => 'TEXT' 或 'HTML'、report_level => 'ALL',并传入 sql_id 和时间范围(start_time/end_time):
SELECT DBMS_PERF.REPORT_SQL_MONITOR(
sql_id => 'abc123xyz',
start_time => TO_TIMESTAMP('2026-05-13 14:00:00', 'YYYY-MM-DD HH24:MI:SS'),
end_time => TO_TIMESTAMP('2026-05-13 15:00:00', 'YYYY-MM-DD HH24:MI:SS'),
type => 'TEXT',
report_level => 'ALL'
) AS report FROM DUAL;
注意:DBMS_PERF 是 12.1.0.2+ 引入的替代方案,DBMS_SQL_MONITOR 仅支持实时(session_id => NULL 也不行);DBMS_AUTO_REPORT 可调用但底层仍走 DBMS_PERF。
为什么查不到某条 SQL 的历史监控记录?
历史 SQL Monitor 数据依赖两个前提,缺一不可:
-
STATISTICS_LEVEL必须为TYPICAL或ALL(BASIC会禁用 ASH 和 SQL Monitor 采集) - 该 SQL 执行时满足「自动监控触发条件」:执行时间 > 5 秒,或并行度 > 1,或消耗 CPU/IO 超过内部阈值(不可配)
- 数据只保留在 AWR 中(通过
DBA_HIST_REPORTS+DBA_HIST_REPORTS_DETAILS关联),但不是所有 AWR 快照都存了监控报告——只有被DBMS_PERF显式捕获并写入WRH$_SQLMON的才可查 - 默认保留策略由
_sqlmon_max_plan(默认 200)和_sqlmon_threshold(默认 5 秒)控制,超限后老记录被覆盖
没有 DBA 权限时能查自己的历史监控吗?
可以,但受限明显:
普通用户只能查自己执行过的、且满足自动监控条件的 SQL,且需被授予 SELECT_CATALOG_ROLE 或显式授权访问 DBA_HIST_REPORTS 等视图。更现实的做法是用 V$SQL + DBA_HIST_SQLSTAT 拼接执行统计,再结合 DBA_HIST_ACTIVE_SESS_HISTORY 还原关键时段的等待链——虽然没图形化监控报告直观,但能定位到 SQL_ID、执行耗时峰值、主要等待事件(如 enq: TX - row lock contention)。
真正缺失的永远不是权限,而是那条 SQL 当初压根没进监控队列——它跑得太快,或者没被 Oracle 认为“值得盯”。











