怎樣查看數據庫的執行計劃

執行計劃是oracle調優的最基本方法,查看執行計劃的方法很多,下面看一下有哪些辦法直接查看執行計劃:

 

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格式化跟蹤文件:
查找後使用tkprof命令:
    SQL> $tkprof D:\......\SID_ora_5352.trc D:\......\SID_ora_5352.txt

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章