Oracle中獲取執行計劃的幾種方法分析

1. 預估執行計劃 - Explain Plan
Explain plan以SQL語句做爲輸入,獲得這條SQL語句的執行計劃,並將執行計劃輸出存儲到計劃表中。 
首先,在你要執行的SQL語句前加explain plan for,此時將生成的執行計劃存儲到計劃表中,語句以下:
explain plan for SQL語句
而後,在計劃表中查詢剛剛生成的執行計劃,語句以下:
select * from table(dbms_xplan.display);
注意:Explain plan只生成執行計劃,並不會真正執行SQL語句,所以產生的執行計劃有可能不許,由於: sql

1)當前的環境可能和執行計劃生成時的環境不一樣;
2)不會考慮綁定變量的數據類型;
3)不進行變量窺視。 緩存

2. 查詢內存中緩存的執行計劃 (dbms_xplan.display_cursor)
若是你想獲取正在執行的或剛執行結束的SQL語句真實的執行計劃(即獲取library cache中的執行計劃),能夠到動態性能視圖裏查詢。方法以下: session

1)獲取SQL語句的遊標
遊標分爲父遊標和子游標,父遊標由sql_id(或聯合address和hash_value)字段表示,子游標由child_number字段表示。 工具

若是SQL語句正在運行,能夠從v$session中得到它的遊標信息,如:
select status, sql_id, sql_child_number from v$session where status='ACTIVE' and .... 性能

若是知道SQL語句包含某些關鍵字,能夠從v$sql視圖中得到它的遊標信息,如:
select sql_id, child_number, sql_text from v$sql where sql_text like '%關鍵字%‘ 測試

2)獲取庫緩存中的執行計劃
爲了獲取緩存庫中的執行計劃,能夠直接查詢動態性能視圖v$sql_plan和v$sql_plan_statistics_all等,但更方便的方法是以sql_id和子游標爲參數,執行以下語句:
select * from table(dbms_xplan.display_cursor('sql_id',child_number)); 優化

3)獲取前一次的執行計劃:
set serveroutput off
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); spa

3. 查詢歷史執行計劃(dbms_xplan.display_awr)
AWR會定時把動態性能視圖中的執行計劃保存到dba_hist_sql_plan視圖中,若是你想要查看歷史執行計劃,能夠採用以下方法查詢:
select * from table(dbms_xplan.display_awr('sql_id'); server

4. 在用sqlplus作SQL開發是(Autotrace)
set autotrace是sqlplus工具的一個功能,只能在經過sqlplus鏈接的session中使用,它很是適合在開發時測試SQL語句的性能,有如下幾種參數可供選擇: 進程

SET AUTOTRACE OFF ---------------- 不顯示執行計劃和統計信息,這是缺省模式
SET AUTOTRACE ON EXPLAIN ------ 只顯示優化器執行計劃
SET AUTOTRACE ON STATISTICS -- 只顯示統計信息
SET AUTOTRACE ON ----------------- 執行計劃和統計信息同時顯示
SET AUTOTRACE TRACEONLY ------ 不真正執行,只顯示預期的執行計劃,同explain plan

5. 生成Trace文件查詢詳細的執行計劃 (SQL_Trace, 10046)
SQL_TRACE做爲初始化參數能夠在實例級別啓用,也能夠只在會話級別啓用,在實例級別啓用SQL_TRACE會致使全部進程的活動被跟蹤,包括後臺進程及全部用戶進程,這一般會致使比較嚴重的性能問題,因此在通常狀況下,咱們使用sql_trace跟蹤當前進程,方法以下:

SQL>alter session set sql_trace=true;
...被跟蹤的SQL語句...
SQL>alter session set sql_trace=false;
若是要跟蹤其它進程,能夠經過Oracle提供的系統包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION來實現,例如:
SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true) --開始跟蹤
SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,false) --結束跟蹤

生成trace文件後,再用tkprof 工具將sql trace 生成的跟蹤文件轉換成易讀的格式,語法以下: tkprof inputfile outputfile 10046事件是SQL_TRACE的一個升級版,它也是追蹤會話,生成Trace文件,只是它裏面的內容更詳細,

相關文章
相關標籤/搜索