Oracle檢視執行計劃常用方法

zhang_1202發表於2015-11-12

 

檢視執行計劃常用方法

 

1explain plan命令

2DBMS_XPLAN

3AUTOTRACE開關

410046事件

510053事件

6AWR SQL報告

 

 

1、 explain plan(相當於PL/SQLF5

explain plan for select * from dual;

select * from table(dbms_xplan.display);

 

注:相關表plan_table$是一個on commit preserve rows的global temporary table。

 

2、 DBMS_XPLAN

方法1:配合explain plan使用

explain plan for select * from dual;

select * from table(dbms_xplan.display);

 

方法2:跟在執行語句後面,‘advanced’比‘all’多顯示了“Outline Data”內容

set linesize 800

set pagesize 900

col plan_table_output for a200

select * from table(dbms_xplan.display_cursor(null,null,'advanced'));


方法3:只要目標SQL的執行計劃所在的Child Cursor還沒有被age outShared Pool,就可以使用該方法檢視SQL執行計劃

select sql_text, sql_id, hash_value, child_number

        from v$sql

       where sql_text like 'select count(*) from sh.customers%';

select * from table(dbms_xplan.display_cursor('sql_id/hash_value',

child_cursor_number,'advanced'));



方法4:用於檢視指定SQL的所有歷史執行計劃,沒有謂詞資訊

--目標SQL可能有多個Child Cursor,即多個執行計劃

select sql_text, sql_id, version_count, executions

        from v$sqlarea

 where sql_text like 'select count(*) from sh.customers%';

select * from table(dbms_xplan.display_awr('sql_id'));


注:Oracle把執行計劃取樣資料從V$sql_plan搬到AWR Repository基表wrh$_sql_plan中沒有保留謂詞資訊的記錄。

 

3、 AUTOTRACE開關

可以額外觀察到目標SQL執行時所耗費的物理讀、邏輯讀、產生redo數量以及排序的數量。(statistics

set outotrace on;

set outotrace off;

set outotrace traceonly;--不現實SQL執行結果

set outotrace traceonly explain;

set outotrace traceonly statistics;

 

 

 

4、 10046事件與tkprof命令

明確顯示了目標SQL實際執行計劃中每一個執行步驟所消耗的邏輯讀、物理讀和花費的時間。(USER_DUMP_DEST目錄下生成trace檔案。

--開啟

alter session set events '10046 trace name context forever,level 12';

oradebug event 10046 trace name context forever,level 12;

--關閉

alter session set events '10046 trace name context off';

oradebug event 10046 trace name context off;

注:level 12表示trace檔案中還包含目標SQL所使用的繫結變數的值以及該session所經歷的等待事件。

 

--操作步驟--

aSQL> oradebug setmypid;

bSQL> oradebug event 10046 trace name context forever,level 12;

cSQL> select count(*) from dual;

dSQL> oradebug tracefile_name;

   /oracle/app/oracle/diag/rdbms/test/test/trace/test_ora_4288.trc

eSQL> oradebug event 10046 trace name context off;

f[oracle@test ~]$tkprof /oracle/app/oracle/diag/rdbms/test

/test/trace/test_ora_4288.trc /oracle/test_ora_4288_tkprof.trc

 

5、 10053事件

6、 AWR SQL報告、Statspack報告

7、 一些現成的指令碼(display_cursor_9i.sql)

 

 

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

相關文章