2014-12-04 56 views
0

我需要嗅出一个Oracle包的SQL执行计划。如何从使用SQL * Plus参数运行的Oracle包中获取Sql执行计划?

SQL * Plus的代码来运行这个包看起来是这样的:

VARIABLE RC REFCURSOR 
EXEC :RC :=PACKAGENAME.GETREPORTDATA('12_300',1999,2014,'246246',NULL) 
PRINT RC 

我一直在使用SQL做* Plus的,因为它是一个詹金斯工作的一部分,我需要保存输出到一个文件,以进一步比较的目的。

我已经被告知要做到这一点的方法,它看起来像这样:

select 
     sqlplan.operation, 
     sqlplan.options, 
     sqlplan.object_name, 
     sqlplan.cost, 
     sqlplan.depth 
    from v$sqlarea sqlarea, 
     v$session sesion, 
     v$sql_plan sqlplan 
where sesion.sql_hash_value = sqlarea.hash_value 
    and sesion.sql_address = sqlarea.address 
    and sqlarea.plan_hash_value = sqlplan.plan_hash_value 
    and sesion.username = 'USERNAME' order by sqlplan.depth; 

但所有我从这个代码得到的是

 v$sql_plan sqlplan 
     * 
ERROR at line 9: 
ORA-00942: table or view does not exist 

我发现了另一件事是EXPLAIN PLAN命令,但它不适合我,或者我错误地使用它。

说实话,我只是不知道从哪里开始的这...

任何信息都受我:)

+1

你有没有试过把系统。在意见面前? – 2014-12-04 09:05:10

+0

或者您可以跟踪会话并使用tkprof获取每个语句的计划 – ninesided 2014-12-04 09:24:24

+0

另一种方法是检查通过v $ session获取执行语句的sql_id然后使用dbms_xplan.display_cursor()获取存储的执行计划。 – 2014-12-04 10:53:27

回答

1

您需要打开Oracle跟踪,然后再进行诚实赞赏通过跟踪文件

-- All versions. 
SQL> ALTER SESSION SET sql_trace=TRUE; 
SQL> ALTER SESSION SET sql_trace=FALSE; 

SQL> EXEC DBMS_SESSION.set_sql_trace(sql_trace => TRUE); 
SQL> EXEC DBMS_SESSION.set_sql_trace(sql_trace => FALSE); 

SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 8'; 
SQL> ALTER SESSION SET EVENTS '10046 trace name context off'; 

SQL> EXEC DBMS_SYSTEM.set_sql_trace_in_session(sid=>123, serial#=>1234, sql_trace=>TRUE); 
SQL> EXEC DBMS_SYSTEM.set_sql_trace_in_session(sid=>123, serial#=>1234, sql_trace=>FALSE); 

SQL> EXEC DBMS_SYSTEM.set_ev(si=>123, se=>1234, ev=>10046, le=>8, nm=>' '); 
SQL> EXEC DBMS_SYSTEM.set_ev(si=>123, se=>1234, ev=>10046, le=>0, nm=>' '); 

-- Available from SQL*Plus since 8i (commandline utility prior to this. 
SQL> CONN sys/password AS SYSDBA; -- User must have SYSDBA. 
SQL> ORADEBUG SETMYPID;   -- Debug current session. 
SQL> ORADEBUG SETOSPID 1234;  -- Debug session with the specified OS process. 
SQL> ORADEBUG SETORAPID 123456; -- Debug session with the specified Oracle process ID. 

SQL> ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12; 
SQL> ORADEBUG TRACEFILE_NAME;  -- Display the current trace file. 
SQL> ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF; 

-- All versions, requires DBMS_SUPPORT package to be loaded. 
SQL> EXEC DBMS_SUPPORT.start_trace(waits=>TRUE, binds=>FALSE); 
SQL> EXEC DBMS_SUPPORT.stop_trace; 

SQL> EXEC DBMS_SUPPORT.start_trace_in_session(sid=>123, serial=>1234, waits=>TRUE, binds=>FALSE); 
SQL> EXEC DBMS_SUPPORT.stop_trace_in_session(sid=>123, serial=>1234); 

0 - 没有跟踪。像关闭sql_trace。 2 - 相当于常规的sql_trace。 4 - 与2相同,但添加了绑定变量值。 8 - 与2相同,但添加了等待事件。 12 - 与2相同,但同时绑定变量值和等待事件。

然后,您将使用oracle实用程序“tkprof”将跟踪格式化为更具可读性的版本。