Oracle中使用DBMS_XPLAN查看執行計劃的方法

目錄

一、簡介

二、示例

三、dbms_xplan.display_cursor返回列參數詳解

四、參考資料


一、簡介

DBMS_XPLAN是Oracle提供的一個用於查看SQL計劃,包括執行計劃和解釋計劃的包.DBMS_XPLAN包給出了更加簡化的獲取和顯示計劃的方式。 DBMS_XPLAN包不僅可以獲取解釋計劃,還可以用來輸出存儲在AWR、SQL調試集、緩存的SQL遊標,以及SQL基線中的語句計劃。下面將重點討論關於DBMS_XPLAN包在解釋計劃和執行計劃上的應用。

首先看一個經常使用的查看某條語句的解釋計劃的示例:

//登錄oracle
sqlplus / as sysdba
//查看執行計劃
explain plan for select * from scott.emp;
select * from table(dbms_xplan.display);

上例中使用了dbms_xplan.display方法來顯示PLAN_TABLE中保存的解釋計劃,如果想要顯示執行計劃,就需要使用到DMBS_XPLAN.DISPLAY_CURSOR方法。

DMBS_XPLAN.DISPLAY_CURSOR方法語法如下:

DBMS_XPLAN.DISPLAY_CURSOR(
   sql_id        IN  VARCHAR2  DEFAULT  NULL,
   child_number  IN  NUMBER    DEFAULT  NULL,
   format        IN  VARCHAR2  DEFAULT  'TYPICAL'
);

參數解釋如下:

  • sql_id:表示存儲在cursor cache中的SQL語句的id;
  • child_number:用於指示緩存sql語句計劃的子id;
  • format:參數用於控制包含在輸出中的信息類型; 

除了以上的基本的四種輸出格式外,format還有一些附加的選項可用於定製化輸出行爲,使用中可以通過逗號和空格分隔來聲明多個關鍵字,同時可以使用”+”和”-”符號來包含或排除相應的顯示元素,這些附加的選項在官方文檔中可以查到:

1.ROWS – 顯示被優化器估算的記錄的行號
2.BYTES – 顯示優化器估算的字節數
3.COST – 顯示優化器計算的成本信息
4.PARTITION – 顯示分區的分割信息
5.PARALLEL – 顯示並行執行信息
6.PREDICATE – 顯示謂語
7.PROJECTION – 顯示列投影部分(每一行的那些列被傳遞給其父列已經這些列的大小)
8.ALIAS – 顯示查詢塊名稱已經對象別名
9.REMOTE – 顯示分佈式查詢信息
10.NOTE – 顯示註釋
11.IOSTATS – 顯示遊標執行的IO統計信息
12.MEMSTATS – 爲內存密集運算如散列聯結,排序,或一些類型的位圖運算顯示內存管理統計信息
13.ALLSTATS – 與'IOSTATS MEMSTATS'等價
14.LAST – 顯示最後執行的執行計劃統計信息,默認顯示爲ALL類型,並且可以累積。

二、示例

【a】使用display_cursor方法查看最近一條語句的執行計劃

//收集運行時的統計信息,包括行數,一直讀取次數,物理讀次數,物理寫次數以及運算在一行數據上耗費的運行時間,如果沒有指定該參數,就不會有A-Rows,A-Time,Buffers這三列信息
select /*+ gather_plan_statistics */ count(*) from scott.emp;

//將sql_id和child_number設置成null,表示獲取上一條執行語句的執行計劃
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));

執行過程如下圖所示: 

【b】獲取某條指定語句的執行計劃

//執行一個簡單查詢
select count(*) from scott.emp where sal between 100 and 3000;

//收集運行時的統計信息
select /*+ gather_plan_statistics */ count(*) from scott.emp where sal between 100 and 3000;

//通過v$sql視圖查詢到sql語句的SQL_ID和CHILD_NUMBER(注意,必須要確保要查詢的sql語句還在shared pool中)
select sql_id,child_number,sql_text from v$sql where sql_text like '%select /*+ gather_plan_statistics */ count(*)%';

//查看該語句執行時的實現執行計劃,將上一步查詢出來的sql_id作爲傳遞進去
select * from table(dbms_xplan.display_cursor('d86dz1fjtn7g7',0,'ALLSTATS LAST'));

執行過程如下圖所示:  

詳細的執行過程參考如下:


SQL> select count(*) from scott.emp where sal between 100 and 3000;

  COUNT(*)
----------
        13

SQL> select /*+ gather_plan_statistics */ count(*) from scott.emp where sal between 100 and 3000;

  COUNT(*)
----------
        13

SQL> select sql_id,child_number,sql_text from v$sql where sql_text like '%select /*+ gather_plan_statistics */ count(*)%';

SQL_ID        CHILD_NUMBER
------------- ------------
SQL_TEXT
--------------------------------------------------------------------------------
d86dz1fjtn7g7            0
select /*+ gather_plan_statistics */ count(*) from scott.emp where sal between 1
00 and 3000

94m52fnv9j1u1            0
 select /*+ gather_plan_statistics */ count(*) from scott.emp

b66kdapyrka0z            0
select sql_id,child_number,sql_text from v$sql where sql_text like '%select /*+

SQL_ID        CHILD_NUMBER
------------- ------------
SQL_TEXT
--------------------------------------------------------------------------------
gather_plan_statistics */ count(*)%'


SQL> select * from table(dbms_xplan.display_cursor(' d86dz1fjtn7g7',0,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID:  d86dz1fjtn7g7, child number: 0 cannot be found


SQL> select * from table(dbms_xplan.display_cursor('d86dz1fjtn7g7',0,'ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  d86dz1fjtn7g7, child number 0
-------------------------------------
select /*+ gather_plan_statistics */ count(*) from scott.emp where sal
between 100 and 3000

Plan hash value: 2083865914

--------------------------------------------------------------------------------
-----

| Id  | Operation          | Name | Starts | E-Rows | A-Rows |   A-Time   | Buff

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
ers |

--------------------------------------------------------------------------------
-----

|   0 | SELECT STATEMENT   |      |      1 |        |      1 |00:00:00.01 |
  7 |

|   1 |  SORT AGGREGATE    |      |      1 |      1 |      1 |00:00:00.01 |
  7 |


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   TABLE ACCESS FULL| EMP  |      1 |     13 |     13 |00:00:00.01 |
  7 |

--------------------------------------------------------------------------------
-----


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(("SAL"<=3000 AND "SAL">=100))

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------


已選擇20行。

SQL>

三、dbms_xplan.display_cursor返回列參數詳解

dbms_xplan.display_cursor返回的列參數說明:

  • Id:步驟序號,如果前面有*,表示這一步會根據某一個過濾條件過濾數據;
  • Operation:執行的操作,比如索引掃描,選擇數據,表連接等等;
  • Name:操作的對象;
  • Starts:對應的動作執行的次數;
  • E-Rows:優化器估算這一步返回的數據行數(每次執行的估計);
  • A-Rows:這一步實際返回的數據行數,實際值是累積計數;例如E-Rows = 15並且A-Rows = 225是完全合理的,因爲第5行開始了15次:所以225實際行= 15開始*每次啓動估計有15行.
  • A-Time:實際耗費的時間;
  • Buffers:實際的邏輯IO數量,這裏是累計值,包括子操作的值; 

四、參考資料

https://blog.csdn.net/liqfyiyi/article/details/7421242

https://www.cnblogs.com/princessd8251/articles/3537457.html

http://blog.itpub.net/31401608/viewspace-2148824/

https://www.cnblogs.com/tracy/archive/2010/04/16/1713272.html

http://www.mamicode.com/info-detail-2327550.html

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