ash报告不支持直接按username过滤,因v$active_session_history仅含user_id字段;需先查user_id再关联过滤,或预筛选数据后人工分析。
ash报告里怎么只看某个用户的会话活动
直接用 dbms_workload_repository.ash_report_text 或 ash_report_html 时,默认不支持按 username 过滤,它底层查的是 v$active_session_history,而该视图只有 user_id 字段,没有明文 username。所以不能靠传参“user=scott”就生效。
真正可行的方式是:先拿到目标用户的 USER_ID,再用 session_id + session_serial# 反向关联,或更稳妥地——在生成报告前,用 SQL 预过滤 V$ACTIVE_SESSION_HISTORY 数据,再喂给报告函数。
- 查用户 ID:
SELECT user_id FROM dba_users WHERE username = 'SCOTT' - ASH 报告函数本身不接受
username参数,强行传会静默忽略 - 别依赖 AWR 报告的「Top Users」页签——那是汇总统计,不是原始会话级过滤
用 DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_* 时如何注入用户过滤逻辑
Oracle 官方没提供现成的 username 过滤入口,但 ASH_REPORT_TEXT 等函数支持一个叫 sql_id 的可选参数,这不是用来过滤用户的,而是用来高亮某条 SQL 的执行路径。真要按用户筛,得绕道:先构造一个临时的 ASH 数据子集,再用 DBMS_WORKLOAD_REPOSITORY.ASH_REPORT_HTML 的 l_dbid、l_inst_num、l_btime、l_etime 四个时间/实例维度参数限定范围,然后在调用前手动把目标用户的 USER_ID 塞进临时表或物化视图,再改写内部查询逻辑(不推荐)——实际项目中更常用的是「先查后筛」。
- 最简实操:用
SELECT * FROM V$ACTIVE_SESSION_HISTORY WHERE user_id = 123查出数据,导出为 CSV,人工分析关键等待事件和执行计划 - 若必须生成标准 HTML 报告:写 PL/SQL 匿名块,把过滤后的 ASH 记录插入到全局临时表,再用自定义脚本模拟报告结构(注意:这已脱离标准 ASH_REPORT 函数范畴)
-
ASH_REPORT_HTML的report_level参数设为'ALL'不会增强用户粒度,只影响等待事件展开深度
为什么直接 WHERE username = 'xxx' 在 V$ACTIVE_SESSION_HISTORY 里查不到数据
因为 V$ACTIVE_SESSION_HISTORY 视图里压根没有 username 列。它只有 user_id,且这个字段在会话断开后可能被复用,甚至在某些快照中为 NULL(比如后台进程、SYS 操作)。你看到的很多文档示例里写了 username,其实是连了 dba_users 做 JOIN 后的结果,不是原生字段。
- 正确关联方式:
SELECT s.sample_time, u.username, s.event, s.sql_id FROM v$active_session_history s LEFT JOIN dba_users u ON s.user_id = u.user_id - 注意
dba_users是字典视图,权限不足时查不到;换成all_users或确保有SELECT_CATALOG_ROLE - 如果用户刚被 DROP,
user_id可能指向已删除记录,JOIN 结果为 NULL —— 这时候看到的“无用户名”不是 bug,是事实
Schema 级过滤和用户级过滤根本不是一回事
很多人混淆「Schema」和「User」:在 Oracle 里,Schema 名通常等于 User 名,但 Schema 是逻辑容器,User 是认证主体。ASH 统计的是会话所属的 user_id,不是当前操作的 current_schema。比如用户 SCOTT 执行了 ALTER SESSION SET CURRENT_SCHEMA = HR,之后所有未带 owner 的对象引用都走 HR Schema,但 ASH 里记录的仍是 user_id 对应 SCOTT 的 ID。
- 想追踪 HR Schema 下的活动?得查
sql_id对应的PARSING_SCHEMA_ID,再 JOINdba_users,而不是过滤user_id -
V$ACTIVE_SESSION_HISTORY.PARSING_SCHEMA_ID才反映语句实际解析时的 Schema,但它在绑定变量重用等场景下也可能失真 - 没有快捷方式能在一个 ASH 报告里同时按「登录用户」+「当前 Schema」+「解析 Schema」三重过滤——每次只能锚定一个维度
真正麻烦的地方在于:ASH 快照是 1 秒采样一次,但一个长事务可能跨越多个快照,而 user_id 和 schema_id 在不同快照中可能不一致。这时候光靠单次报告容易漏掉上下文,得结合 DBA_HIST_ACTIVE_SESS_HISTORY 做跨小时聚合,再人工对齐时间线。










