
dba_hist_active_sess_history 这个里面的数据是怎么来的? 为什么在v$sql 中查得到的sql_id 在 dba_hist_active_sess_history 里面没有?

dba_hist_active_sess_history 视图中的数据来自于 Oracle 的自动工作负载存储库 (AWR)。这个存储库定期收集数据库的性能统计信息,包括活动会话历史 (ASH) 数据。ASH 数据提供了数据库中的会话活动的样本,每秒收集一次。
v$sql 视图中的数据则是数据库中当前活动的 SQL 语句的信息。
因此,如果你在 v$sql 中找到一个 SQL 语句,但在 dba_hist_active_sess_history 中找不到,可能有以下几个原因:
1. SQL 语句执行的时间可能在 AWR 的采样间隔之外。例如,如果 SQL 语句在两次 AWR 快照之间执行并完成,那么你可能在 ASH 数据中找不到它。
2. AWR 只保留一段时间的数据。默认情况下,AWR 保留 8 天的数据。如果 SQL 语句执行的时间超过了这个时间范围,那么你在 ASH 数据中也找不到它。
3. AWR 可能没有收集到所有的 SQL 语句。AWR 的采样率可能不足以捕获所有的 SQL 语句,特别是那些执行时间非常短的 SQL 语句。
4. 如果数据库在执行 SQL 语句时没有足够的活动会话,那么这个 SQL 语句可能不会出现在 ASH 数据中。因为 ASH 数据是基于活动会话的,所以如果没有活动会话,那么 SQL 语句就不会被记录下来。


oracle 后台进程每秒对v$session 做快照, 把状态是ACTIVE的记录临时存放到v$active_session_history;
每隔10秒的v$active_session_history记录会保存到dba_hist_active_sess_history (AWR)
如果你的SQL执行时间超过10秒, 应该会出现在dba_hist_active_sess_history(超过awr保留期的历史SQL除外)
如果你的SQL执行时间比较短, 执行次数比较少, 被v$active_session_history采集到的概率就比较小, 即使被v$active_session_history采集到, 也可能是没有保存到dba_hist_active_sess_history的那9/10 .
如果SQL执行比较频繁, 即使时间很短, 也很有可能被dba_hist_active_sess_history捕获到


