ash数据为空或时间跨度极短,首要检查statistics_level是否为basic(功能级关闭ash),若确认则立即设为typical;其次验证_ash_size是否过小导致环形缓冲区快速覆盖,需调大并同步增大sga_max_size;最后排查control_management_pack_access=none或快照被禁用等深层原因。

ASH数据为空或时间跨度极短,先查statistics_level是否为BASIC
ASH根本不会写入任何记录,如果statistics_level被设成BASIC。这不是配置没生效,而是功能级关闭——连v$active_session_history都返回空行,DBA_HIST_ACTIVE_SESS_HISTORY里也只剩时间戳和空字段。
立即执行:SELECT name, value FROM v$parameter WHERE name = 'statistics_level';,若结果是BASIC,必须改回TYPICAL:ALTER SYSTEM SET statistics_level = typical SCOPE = BOTH;。该语句立即生效,无需重启。
注意:statistics_level = ALL虽也启用ASH,但会额外采集OS统计等开销更大的信息,11g中不推荐;TYPICAL是默认且足够。
查不到最近数据,别用SYSDATE - N/1440这种相对时间条件
用SAMPLE_TIME > SYSDATE - 1/1440查“最近1分钟”,在跨天或时区不一致场景下极易出错:比如凌晨2:00执行,SYSDATE - 1/1440算出来是1:59,但实际卡顿发生在1:59:58–2:00:03之间,这个窗口就被切掉了。
正确做法是手动指定精确时间范围:
WHERE SAMPLE_TIME BETWEEN TIMESTAMP '2026-07-20 02:59:50' AND TIMESTAMP '2026-07-20 02:00:10'- 时间格式必须严格为
YYYY-MM-DD HH24:MI:SS,不能省略秒,也不能用TO_DATE套壳 - 若不确定具体时间点,先查
V$INSTANCE.STARTUP_TIME,再结合业务日志缩小窗口
v$active_session_history时间跨度远小于60分钟,大概率是_ash_size不够
ASH内存缓冲区是固定大小的环形队列,默认仅4194304字节(4MB)。高并发下撑不过10–15分钟,老样本被新样本覆盖是常态,不是故障。
验证方法:SELECT MIN(sample_time), MAX(sample_time) FROM v$active_session_history;,若结果差值远小于60分钟,基本可判定buffer已满。
扩容需两步:
- 调大
_ash_size:ALTER SYSTEM SET "_ash_size" = 524288000 SCOPE = SPFILE;(设为500MB) - 同步调大
sga_max_size,否则下次启动失败:ALTER SYSTEM SET sga_max_size = 2G SCOPE = SPFILE; - 两项修改均需重启实例才生效
查DBA_HIST_ACTIVE_SESS_HISTORY仍为空,检查control_management_pack_access和快照调度
即使statistics_level = TYPICAL,DBA_HIST_ACTIVE_SESS_HISTORY也可能全为空——因为control_management_pack_access被设为NONE,这是11.1–11.2的经典坑:AWR快照照常生成,但所有性能字段(SQL执行数、等待事件、I/O统计)全为NULL。
执行:SELECT name, value FROM v$parameter WHERE name IN ('statistics_level', 'control_management_pack_access');,若后者为NONE,需联系DBA确认许可证状态,无法通过参数修改绕过。
另外,快照可能被停用:
- 查当前设置:
SELECT snap_interval, retention FROM dba_hist_wr_control; - 若
snap_interval显示为+000000000 00:00:00.0,说明已被禁用 - 恢复命令:
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(interval => 60, retention => 43200);(60分钟间隔,30天保留)
真正难定位的缺失,往往不是参数错了,而是你查的时间段本就不在ASH内存窗口内,也没被AWR快照捕获——这时候得回头翻alert.log、查v$system_event累计等待、甚至用oradebug抓进程堆栈。ASH只是线索,不是全部。











