如何通过SQL查询获取Oracle指定快照时间段内执行的SQL_ID列表
获取Oracle指定AWR快照时间段内的所有SQL_ID列表
核心解决方案(基于AWR持久化数据)
要获取指定快照区间内执行过的所有SQL_ID,直接查询AWR的历史统计视图即可——V$SQL仅保存当前内存中的SQL,历史执行的SQL可能已被清理,而AWR的DBA_HIST_SQLSTAT视图存储了快照捕获的SQL统计数据,结合DBA_HIST_SNAPSHOT过滤时间段:
SELECT DISTINCT s.sql_id FROM dba_hist_sqlstat s JOIN dba_hist_snapshot sn ON s.snap_id BETWEEN &begin_snap_id AND &end_snap_id AND s.dbid = sn.dbid AND s.instance_number = sn.instance_number WHERE sn.snap_id = &begin_snap_id;
按时间范围过滤的版本(无需手动查快照ID)
如果不知道具体快照ID,可直接通过快照的时间范围查询:
SELECT DISTINCT s.sql_id FROM dba_hist_sqlstat s JOIN dba_hist_snapshot sn ON s.snap_id = sn.snap_id AND s.dbid = sn.dbid AND s.instance_number = sn.instance_number WHERE sn.begin_interval_time >= TO_DATE('&start_date', 'YYYY-MM-DD HH24:MI:SS') AND sn.end_interval_time <= TO_DATE('&end_date', 'YYYY-MM-DD HH24:MI:SS');
关键说明
DBA_HIST_SNAPSHOT:存储AWR快照的元数据,包括快照ID、开始/结束时间、数据库ID和实例号DBA_HIST_SQLSTAT:每个快照周期内捕获的SQL执行统计,同一个SQL_ID可能在多个快照周期内被记录,因此用DISTINCT去重- 需确保当前用户拥有
SELECT_CATALOG_ROLE或直接访问这两个视图的权限
关于V$SQL的补充
如果需要同时包含当前内存中仍存在的、且在指定时间段内执行过的SQL,可结合V$SQL(注意V$SQL的LAST_ACTIVE_TIME仅记录最后一次执行时间,无法覆盖整个时间段的所有执行记录):
-- 合并AWR历史SQL和当前内存中的SQL SELECT sql_id FROM ( SELECT DISTINCT s.sql_id FROM dba_hist_sqlstat s JOIN dba_hist_snapshot sn ON s.snap_id = sn.snap_id AND s.dbid = sn.dbid AND s.instance_number = sn.instance_number WHERE sn.begin_interval_time >= TO_DATE('&start_date', 'YYYY-MM-DD HH24:MI:SS') AND sn.end_interval_time <= TO_DATE('&end_date', 'YYYY-MM-DD HH24:MI:SS') UNION SELECT DISTINCT sql_id FROM v$sql WHERE last_active_time BETWEEN TO_DATE('&start_date', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('&end_date', 'YYYY-MM-DD HH24:MI:SS') );
内容的提问来源于stack exchange,提问作者abhi
相关产品推荐
相关产品推荐

