1. 直接查询V$SQLV$SQLAREA视图

通过系统视图V$SQLV$SQLAREA可直接获取共享池中缓存的SQL执行记录,包括历史SQL文本、执行次数、CPU/耗时等统计信息:


sqlCopy Code

-- 查询所有执行过的SQL(按总耗时降序) SELECT sql_id, sql_text, executions, ROUND(elapsed_time/1000, 2) AS total_elapsed_time_s, ROUND(cpu_time/1000, 2) AS cpu_time_s, first_load_time, last_active_time FROM v$sql ORDER BY elapsed_time DESC;

  • 关键字段‌:sql_text(SQL文本)、executions(执行次数)、last_active_time(最后执行时间)‌16。

2. 结合会话信息关联查询

通过关联V$SESSIONV$SQL视图,可追溯SQL执行者及会话信息:


sqlCopy Code

-- 查询SQL执行者及会话详情 SELECT s.sid, s.username, s.osuser, s.machine, q.sql_text, q.executions, q.last_load_time FROM v$session s JOIN v$sql q ON s.sql_id = q.sql_id WHERE q.last_active_time > SYSDATE - 7; -- 近7天执行的SQL

  • 说明‌:v$session提供会话的登录用户、操作系统信息,v$sql关联具体SQL内容‌23。

3. 按时间或操作类型过滤

针对特定时间段或操作类型(如DELETEUPDATE)进行精确筛选:


sqlCopy Code

-- 查询2025年3月1日后的DELETE操作记录 SELECT sql_text, parsing_user_id, last_active_time FROM v$sqlarea WHERE sql_text LIKE 'DELETE%' AND last_active_time >= TO_DATE('2025-03-01', 'YYYY-MM-DD');

  • 注意‌:v$sqlarea视图包含完整的SQL文本,但需注意LIKE模糊匹配的性能影响‌47。

4. 按用户或权限过滤

通过parsing_user_idparsing_schema_name字段追踪特定用户的SQL执行记录:


sqlCopy Code

-- 查询用户SCOTT执行过的SQL SELECT sql_text, executions, last_active_time FROM v$sql WHERE parsing_user_id = (SELECT user_id FROM dba_users WHERE username = 'SCOTT');

  • 依赖权限‌:需具备DBA_USERSV$SQL的查询权限‌57。

注意事项

  1. 数据保留周期‌:V$SQLV$SQLAREA存储的是共享池中的缓存SQL,若实例重启或SQL被淘汰,历史记录可能丢失‌16。
  2. 权限要求‌:查询系统视图需授予SELECT_CATALOG_ROLE或直接授权(如GRANT SELECT ON v_$sql TO user;)‌78。
  3. 性能影响‌:高频查询系统视图可能对数据库性能产生轻微影响,建议在非高峰时段操作‌23。

以上方法可综合使用,建议优先通过V$SQL按时间或用户维度缩小查询范围,再关联会话信息定位问题SQL‌14。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐