以下是對Oracle中獲取執行計劃的幾種方法進行了詳細的分析介紹
需要的朋友可以參考下
預估執行計劃 Explain Plan
Explain plan以SQL語句作為輸入得到這條SQL語句的執行計劃並將執行計劃輸出存儲到計劃表中
首先在你要執行的SQL語句前加explain plan for此時將生成的執行計劃存儲到計劃表中語句如下
explain plan for SQL語句
然後在計劃表中查詢剛剛生成的執行計劃語句如下
select * from table(dbms_xplandisplay);
注意Explain plan只生成執行計劃並不會真正執行SQL語句因此產生的執行計劃有可能不准因為
)當前的環境可能和執行計劃生成時的環境不同
)不會考慮綁定變量的數據類型
)不進行變量窺視
查詢內存中緩存的執行計劃 (dbms_xplandisplay_cursor)
如果你想獲取正在執行的或剛執行結束的SQL語句真實的執行計劃(即獲取library cache中的執行計劃)可以到動態性能視圖裡查詢方法如下
)獲取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 %關鍵字%‘
)獲取庫緩存中的執行計劃
為了獲取緩存庫中的執行計劃可以直接查詢動態性能視圖v$sql_plan和v$sql_plan_statistics_all等但更方便的方法是以sql_id和子游標為參數執行如下語句
select * from table(dbms_xplandisplay_cursor(sql_idchild_number));
)獲取前一次的執行計劃
set serveroutput off
select * from table(dbms_xplandisplay_cursor(nullnullALLSTATS LAST));
查詢歷史執行計劃(dbms_xplandisplay_awr)
AWR會定時把動態性能視圖中的執行計劃保存到dba_hist_sql_plan視圖中如果你想要查看歷史執行計劃可以采用如下方法查詢
select * from table(dbms_xplandisplay_awr(sql_id);
在用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
生成Trace文件查詢詳細的執行計劃 (SQL_Trace )
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_systemset_sql_trace_in_session(sidserial#true) 開始跟蹤
SQL> exec dbms_systemset_sql_trace_in_session(sidserial#false) 結束跟蹤
生成trace文件後再用tkprof 工具將sql trace 生成的跟蹤文件轉換成易讀的格式語法如下
tkprof inputfile outputfile
事件是SQL_TRACE的一個升級版它也是追蹤會話生成Trace文件只是它裡面的內容更詳細
From:http://tw.wingwit.com/Article/program/Oracle/201311/19003.html