查看Oracle執行計劃的幾種常用方法

《查看Oracle執行計劃的幾種常用方法-系列1》(http://blog.csdn.net/bisal/article/details/38919181)這篇博文中曾提到一個隱藏問題:

“隱藏問題2:

實驗這部分內容發現使用select * from table(dbms_xplan.display_awr('sql_id'));並沒有結果,@黃瑋老師說有可能是AWR收集的是top的SQL,有可能測試用的SQL不是most intensive SQL,但我是用alter system flush shared_pool後執行的手工採集快照,還是未被AWR抓到,比較奇怪的問題,這個也會在另一篇博文中仔細說明。”

背景是:

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

(1)是使用explain plan for +SQL作爲前提,(2)和(3)的前提則是SQL的執行計劃還在共享池中,具體講是在庫緩存中。如果已經被age out交換出共享池,則不能用這兩種方法了。若該SQL的執行計劃被採集到AWR庫中,則可以用(4)上述SQL來查詢歷史執行計劃。”

即使用這條SQL可以查看AWR庫中保存的執行計劃。但我嘗試用dual表做實驗,發現並沒有被AWR庫保存他的執行計劃(http://www.itpub.net/forum.php?mod=viewthread&tid=1886046&extra=)。

實驗:

1. 創建測試表:


2. 查詢Shared Pool中是否已經緩存了select count(*) from awr_tbl的執行計劃:

3. 手工收集AWR報告,清空Shared Pool緩衝池:

看到緩衝區被清空了,剛纔可以從v$sqlarea中查詢的SQL信息已經刪除了。

4. 使用上面提到的“select * from table(dbms_xplan.display_awr('sql_id'));”看看AWR中保存的SQL信息:

對於@dbsnake說的dbms_xplan.display_awr('sql_id')和dbms_xplan.display_cursor的區別是不能顯示謂詞信息,是因爲從V$SQL_PLAN導入AWR基表WRH$_SQL_PLAN時未將謂詞字段access_predicates和filter_predicates導入,也做了一個實驗:

select count(*) from sys_awr where object_name='SYS_AWR';語句,在V$SQL_PLAN中存在謂詞信息:“OBJECT_NAME=”='SYS_AWR',但從WRH$_SQL_PLAN中看這兩個字段是空的:

總結:


(1) select * from table(dbms_xplan.display);

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

(3) select * from table(dbms_xplan.display_cursor('sql_id/hash_value', child_cursor_number, 'advanced'));

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

以上是使用dbms包查看執行計劃的四種方法,其中:

(1)需要配合explain plan使用。

(2)、(3)需要SQL仍在Shared Pool中。

(4)需要AWR庫保存該SQL信息。另外,不會顯示謂詞信息。

針對不同的場景選擇不同的讀取執行計劃的方法即可。

實驗過程中我曾用select * from dual作爲測試SQL,但未得到如上結果,經@黃瑋大師點播,認爲可能是對於DUAL表的操作Oracle內部不是像正常表檢索的方式來執行的,有機會可以探究。(http://www.itpub.net/forum.php?mod=viewthread&tid=1886046&extra=)
--------------------- 
作者:bisal 
來源:CSDN 
原文:https://blog.csdn.net/bisal/article/details/40503031 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

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