You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:55:26