Oracle 如何查看執行計划
一. 查看方式
1.1. explain plan
先使用explain plan命令對目標SQL做explain,在使用"select * from table(dbms_xplan.display)"查看上述使用explain plan命令后得到的執行計划。
PL/SQL Developer中的快捷鍵F5就是在explain plan命令上的一層封裝。
explain plan for + SQL
select * from table(dbms_xplan.display)
1.2. DBMS_XPLAN
#配合explain plan使用
select * from table(dbms_xplan.display);
#查看剛剛執行過的SQL的執行計划
select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
#只要目標SQL的執行計划所在的Child Cursor沒有被age out出Shared Pool
select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like '%select * from emp%';
#用於查看指定SQL的執行計划
select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number, 'advanced'));
#VERSION_COUNT代表有幾種不同的執行計划
select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like '%select * from emp%';
#查看指定SQL的所有歷史執行計划,前提是該SQL的執行計划被采集到AWR Repository中
select * from table(dbms_xplan.display_awr('sql_id'));
1.3. SQLPLUS中的AUTOTRACE
set serverout
set autotrace {off | on | traceonly}
[explain]
[statistics]
1.4. 10046事件
與之前三種查看執行計划方法不同之處在於,所得到的執行計划中明確顯示了目標SQL實際執行計划中每一個執行步驟所消耗的邏輯讀、物理讀和花費的時間。執行計划與明細資源消耗會寫入此Session所對應的trace文件中,Oracle會在參數
USER_DUMP_DEST所代表的目錄下生成這個trace文件。
- 首先在當前Session中激活10046事件
- 接着在此Session中執行目標SQL
- 最后在此Seesion中關閉10046事件
#激活10046事件兩種方法
alter session set events '10046 trace name context forever,level 12'
oradebug event 10046 trace name context forever,level 12
#關閉10046事件兩種方法
alter session set events '10046 trace name conetxt off'
oradebug event 10046 trace name context off
1.5. 10053事件
1.6. AWR報告
1.7. 腳本
二. 真實執行計划
在Oracle數據庫中判斷得到的執行計划是否准確,就是看目標SQL是否被真正執行,真正執行過的SQL所對應的的執行計划就是准的,反之則有可能不准。
- explian plan命令
- DBMS_XPLAN包
- SQLPLUS中的AUTOTRACE開關
- 10046事件
第一種方法可能不准
第二種方法4種方式中第一個方式可能不准,后三種方式都是准的

第三種方法可能不准
第四種方法准確
