v$active_session_history 视图不含 username 字段,仅含 user_id,需先查 dba_users 获取 user_id 再过滤;ash 报告函数不支持 username 参数,performance hub 也不支持用户名筛选,后台进程需显式指定 session_type。

查不到 username 字段?先确认 V$ACTIVE_SESSION_HISTORY 里根本没有它
直接写 SELECT username FROM v$active_session_history 会立刻报 ORA-00904: "USERNAME": invalid identifier。这不是权限或视图没刷新的问题,而是这个视图压根不存 username —— 只有 user_id。很多文档示例里出现的 username,都是后面手动 JOIN dba_users 加上去的。别在 WHERE 里写 username = 'SCOTT',那条语句根本跑不通。
想看某个用户(比如 SCOTT)的活动,必须先拿到 user_id 再过滤
正确做法分两步:先查 ID,再用 ID 过滤 ASH 数据。不能跳过这一步,也没有“直接按用户名过滤”的标准参数。
-
SELECT user_id FROM dba_users WHERE username = 'SCOTT'—— 记下返回的数字,比如是123 - 再查活动:
SELECT sample_time, session_state, event, sql_id, module FROM v$active_session_history WHERE user_id = 123 AND sample_time > SYSDATE - 30/1440 - 如果要查历史(超 30 分钟),换视图:
DBA_HIST_ACTIVE_SESS_HISTORY,同样用user_id = 123,但注意它每 10 秒采一次,细节更粗
生成带用户过滤的 ASH 报告?标准函数不支持,得绕道
DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML 这类函数根本不认 username 参数。传了也静默忽略,不会报错也不会生效。所谓“Top Users”页签只是汇总统计,不是原始会话级过滤。
- 真要出标准 HTML 报告,只能先用 SQL 按
user_id提取数据,导出 CSV 后人工分析 - 或者写 PL/SQL 把过滤后的记录塞进全局临时表,再模拟报告结构——但这已脱离标准函数范畴,维护成本高
- Database Actions 的 Performance Hub 里可以选时间范围 + 看 ASH Analytics,但它也不支持输入用户名筛选,只能靠后续排序、搜索
容易被忽略的坑:user_id 复用、后台进程、时间精度
查出来的 user_id 不是永远固定的。用户删了重建,ID 可能复用;SYS 或后台进程的 user_id 可能为 NULL;sample_time > SYSDATE - INTERVAL '30' MINUTE 在老版本 Oracle(如 11gR2)会报错,必须用 SYSDATE - 30/1440。
- 如果目标用户刚被 DROP,又新建同名用户,
user_id已变,旧 ASH 记录仍指向原 ID,关联不出新用户名 - 查 DBWR/LGWR 等后台进程时,
session_type = 'BACKGROUND'必须显式加上,否则默认只返回前台会话 - V$ACTIVE_SESSION_HISTORY 数据最多保留约 60 分钟(实际取决于负载和
_ash_size),超时就只能查DBA_HIST_ACTIVE_SESS_HISTORY,但采样变稀疏











