相关疑难解决方法(0)

JDBC Oracle - 获取查询的解释计划

我想知道如何使用Java获取解释计划.我需要这个的原因是因为我们有一个特殊用户可以制作报告的框架.这些报告有时会构建大量查询,我们希望在其中动态解释并存储成本.这样我们就可以在以后分析高成本查询并进行优化.

给出非法列异常的示例代码:

ResultSet rs = null;
   try {
        oracle = ConnectionManager.getConnection(ConnectionManager.Test);
        pstmt = oracle.prepareStatement("begin execute immediate 
        'explain plan for SELECT   1 from Dual'; end;");
        rs = pstmt.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString(1));
        }
Run Code Online (Sandbox Code Playgroud)

java oracle jdbc explain sql-execution-plan

12
推荐指数
2
解决办法
1万
查看次数

由会话执行的Oracle查询

我试图跟踪针对特定数据库用户执行的SQL语句.我没有启用AUDITING,我正在使用Oracle 11g.

我有以下查询:

SELECT  
  S.MODULE, 
  SQL_TEXT , 
  S.EXECUTIONS    
FROM
  SYS.V_$SQL S, 
  SYS.ALL_USERS U
WHERE
  S.PARSING_USER_ID=U.USER_ID 
  AND UPPER(U.USERNAME) IN ('USERNAME')
  AND (UPPER(s.MODULE)='APP.EXE')
ORDER BY S.LAST_LOAD_TIME
Run Code Online (Sandbox Code Playgroud)

但是如果运行'APP.EXE'的多个用户连接到同一个db用户,我无法理解哪个OS用户执行了哪个查询.所以我尝试加入V $ SESSION视图来获取用户详细信息.

SELECT  
  S.MODULE,SQL_TEXT ,SN.OSUSER, SN.MACHINE, S.EXECUTIONS
FROM
  SYS.V_$SQL S, 
  SYS.ALL_USERS U,
  V$SESSION SN 
WHERE
  S.PARSING_USER_ID=U.USER_ID 
  AND UPPER(U.USERNAME) IN ('USERNAME')
  AND (UPPER(S.MODULE)='APP.EXE')
  AND S.SQL_ID=SN.SQL_ID
ORDER BY S.LAST_LOAD_TIME
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用(在我的情况下,它没有返回任何行)所以,我有以下问题

1)如何获得每个会话执行的查询?

2)V_ $ SQL的EXECUTIONS列似乎是来自所有会话的执行.我如何知道会话执行特定查询的次数?

3)有关查询的记录将存储在V_ $ SQL中多长时间?Oracle何时从视图中删除它?

提前感谢你们,

普拉迪普

sql oracle oracle11g

2
推荐指数
1
解决办法
6万
查看次数

标签 统计

oracle ×2

explain ×1

java ×1

jdbc ×1

oracle11g ×1

sql ×1

sql-execution-plan ×1