awr默认不存sql全文,因statistics_level=typical时仅收集执行计划等指标,不捕获sql文本;设为all才启用sql全文、绑定变量等详细信息。
awr 默认不存 sql 全文,除非 statistics_level 设为 all。这是 oracle 11g 的硬限制,不是配置遗漏或权限问题。
为什么 statistics_level = TYPICAL 时看不到 SQL 全文
Oracle 11g 中,statistics_level 控制 AWR 收集哪些统计项:
- BASIC:禁用 AWR、ASH、自动内存管理等,DBA_HIST_SQLTEXT 视图为空
- TYPICAL(默认):收集执行计划、执行次数、逻辑读等,但不采集 SQL 文本本身,DBA_HIST_SQLTEXT 里只有 sql_id 和空的 sql_text 字段
- ALL:额外启用 SQL 文本捕获、绑定变量值、详细等待事件等
所以即使你在 awrrpt.sql 里看到某条 SQL 占了 80% 的 CPU,点进去也只显示 sql_id,没有实际语句——根本没存。
如何确认当前设置是否支持 SQL 全文
- 查当前值:
SHOW PARAMETER statistics_level或SELECT name, value FROM v$parameter WHERE name = 'statistics_level' - 查历史快照是否真有文本:
SELECT COUNT(*) FROM dba_hist_sqltext WHERE sql_text IS NOT NULL AND ROWNUM ;如果返回 0,说明没启用 - 注意:
DBA_HIST_SQLTEXT是按快照周期刷新的,改完参数后需等下一个快照(或手工触发)才开始收录新 SQL 文本
修改 statistics_level 的实际影响
设为 ALL 确实能解决“看不到 SQL”的问题,但要清楚代价:
- 内存开销增加:SQL 文本和绑定值会占用更多 shared pool 和 SGA
- AWR 快照体积变大:尤其在高并发、大量动态 SQL 的系统中,
WRH$_SQLTEXT表增长明显 - 部分环境不允许:金融、政务类系统可能因审计要求禁止记录完整 SQL(含敏感字段)
- 不是所有版本都支持:Oracle 11.2.0.1 及更早小版本对
ALL的实现有 Bug,建议至少用 11.2.0.3+
临时替代方案:用 V$SQL 查当前缓存中的 SQL(但只保留最近执行过的,且实例重启即清空)。
真正需要 SQL 全文时,该怎么做
如果确认要长期启用,执行:
ALTER SYSTEM SET statistics_level = ALL SCOPE=BOTH;
然后等一个快照周期(或立即运行:EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT),再生成 AWR 报告。之后在报告的 SQL Statistics 部分就能看到完整语句。
注意:改回 TYPICAL 后,新快照不再存文本,但已存在的 DBA_HIST_SQLTEXT 记录不会被删——只是后续报告里新增的 SQL 又变“不可见”了。
最常被忽略的一点:即使开了 ALL,如果某条 SQL 执行太快(比如毫秒级)、没进 top-N 统计阈值,它也不会被采样进 AWR,自然也不会出现在报告里。这时候得靠 ASH(V$ACTIVE_SESSION_HISTORY)或实时 V$SQL 补充排查。











