目錄
三、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