檢視執行計劃

wengtf發表於2012-02-03
1、直接使用sqlplus系統引數:
 
    SQL> set autotrace on explain
    SQL> select * from dual;
    D
    -
    X

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 272002086
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
    --------------------------------------------------------------------------
    SQL> set autotrace off
 
    但是這樣操作的結果是先執行SQL,再出執行計劃,如果SQL耗時巨大,則不現實;
 
 
2、使用explain plan for語句:
 
    SQL> explain plan for select * from dual;
    Explained.
    SQL> select * from table(DBMS_XPLAN.display);
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2137789089
    ---------------------------------------------------------------------------------------------
    | Id  | Operation                         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                  |         |  8168 | 16336 |    21   (0)| 00:00:01 |
    |   1 |  COLLECTION ITERATOR PICKLER FETCH| DISPLAY |       |       |
    |     |
    ---------------------------------------------------------------------------------------------
 
    這樣就可以在執行SQL之前檢視執行計劃了
 
 
3、啟用SQL_TRACE跟蹤所有後臺程式活動:
 
    全域性引數設定:
    ..OracleHome/admin/SID/pfile中指定: SQL_TRACE = true (10g)
 
    當前session中設定:
    SQL> alter session set SQL_TRACE=true;
    SQL> select * from dual;
    SQL> alter session set SQL_TRACE=false;
 
    對其他使用者進行跟蹤設定:
    SQL> select sid,serial#,username from v$session where username='XXX';
       SID    SERIAL# USERNAME
    ------ ---------- ------------------
       127      31923 A
       128      54521 B
       129      48940 B
    SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,true);
    SQL> select * from dual;
    SQL> exec dbms_system.set_SQL_TRACE_in_session(127,31923,false);
 
    然後使用oracle自帶的tkprof命令列工具格式化跟蹤檔案。
 
 
4、使用10046事件進行查詢:
 
    10046事件級別:
    Lv1  - 啟用標準的SQL_TRACE功能,等價於SQL_TRACE
    Lv4  - Level 1 + 繫結值(bind values)
    Lv8  - Level 1 + 等待事件跟蹤
    Lv12 - Level 1 + Level 4 + Level 8
 
    全域性設定:
    ..OracleHome/admin/SID/pfile中指定: EVENT="10046 trace name context forever,level 12"
 
    當前session設定:
    SQL> alter session set events '10046 trace name context forever, level 8';
    SQL> select * from dual;
    SQL> alter session set events '10046 trace name context off';
 
    對其他使用者進行設定:
    SQL> select sid,serial#,username from v$session where username='XXX';
       SID    SERIAL# USERNAME
    ------ ---------- ------------------
       127      31923 A
       128      54521 B
       129      48940 B    
    SQL> exec dbms_system.set_ev(127,31923,10046,8,'A');
    SQL> select * from dual;
    SQL> exec dbms_system.set_ev(127,31923,10046,0,'A');
 
 
 
5、使用tkprof格式化跟蹤檔案:
 
    使用一下SQL找到當前session的跟蹤檔案:
 

    ---- 當前 session

    SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name

    from

    ( select p.spid from v$mystat m,v$session s, v$process p

          where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,

    ( select t.instance from v$thread t,v$parameter v

          where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,

    ( select value from v$parameter where name = 'user_dump_dest' ) d;

     

    ---- 其他使用者 session

    SELECT d.value|| '/' ||lower(rtrim(i.instance, chr( 0 )))|| '_ora_' ||p.spid|| '.trc' trace_file_name

    from

    ( select p.spid from v$session s, v$process p

          where s.sid= '127' and s. SERIAL#= '31923' and p.addr = s.paddr) p,

    ( select t.instance from v$thread t,v$parameter v

          where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,

    ( select value from v$parameter where name = 'user_dump_dest' ) d;

 
    查詢後使用tkprof命令:
    SQL> $tkprof D:\......\SID_ora_5352.trc D:\......\SID_ora_5352.txt
 
 
 
9i中預設安裝 無法使用 autotrace,需要手動安裝:

SQL>start $ORACLE_HOME/rdbms/admin/utlxplan.sql;

SQL>create public synonym plan_table for plan_table;

SQL>grant ALL on plan_table to public;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22907091/viewspace-715618/,如需轉載,請註明出處,否則將追究法律責任。

相關文章