我想知道如何使用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) 我试图跟踪针对特定数据库用户执行的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何时从视图中删除它?
提前感谢你们,
普拉迪普