Oracle查询历史记录

时间:2016-12-27 02:58:22

标签: sql oracle jdbc oracle11g

我有这个Java应用程序仍然通过JDBC代码与Oracle 11g通信。话虽如此,想要在Oracle历史记录中检查此应用程序的查询,如果已经存在的话。

要查看的关键项目

  1. 完整查询(包含参数值(已解析而非?),已通过java.sql.PreparedStatement
  2. 查询时间
  3. 使用架构
  4. 用户发起了查询
  5. 预期结果:

    • 通过SQL Developer(带或不带SYSDBA权限)运行的SQL查询,返回所有关键项的密钥

    尝试使用下面的查询,但它不会返回上面列出的关键项:

    select * from v$sql order by last_load_time desc
    

2 个答案:

答案 0 :(得分:0)

正如其他成员已经指出的那样,V$SQLV$SQL_BIND_CAPTUREV$SQLAREA应该为您提供大量有关Java应用程序触发的查询的信息。

请注意,它可能不是完整的时间顺序历史。假设Java应用程序对数据库进行了大量查询,则有可能并非所有查询都存在于V $ SQL中(例如:解析失败的查询,只使用一次不再存在于缓存中的查询等)可能会丢失出)。此外,如果查询被触发两次(使用相同或不同的绑定变量集),您将只在V$SQL

中找到最新的执行条目

如果您的目标是以完美的时间顺序查找所有查询(作为某种类型的Java应用程序的黑盒研究),那么我建议您启用特定会话的跟踪(由SID, SERIAL#在{{1}中标识}})。这将提供有关多个前端的信息,包括查询触发顺序,绑定变量,查询性能等。有关详细信息,请查看this链接。可以完成不同类型和级别的信息收集。此外,如果您计划在任何生产系统上使用它,请考虑其性能开销

答案 1 :(得分:0)

以下查询应返回您需要的信息

    select vsql.sql_text, vses.SCHEMANAME, vsql.ELAPSED_TIME, vses.USERNAME
    from v$session vses join v$sql vsql
    on vses.sql_id=vsql.sql_id
    where contdition;