有關執行計劃中各字段模塊的描述請參考: 執行計劃中各字段各模塊描述
有關由SQL語句來獲取執行計劃請參考: 使用 EXPLAIN PLAN 獲取SQL語句執行計劃
有關使用autotrace來獲取執行計劃請參考:啓用 AUTOTRACE 功能
有關display_cursor函數的使用請參考: dbms_xplan之display_cursor函數的使用 ios
1、執行計劃中各字段的描述
一、基本字段(老是可用的)
Id 執行計劃中每個操做(行)的標識符。若是數字前面帶有星號,意味着將在隨後提供這行包含的謂詞信息
Operation 對應執行的操做。也叫行源操做
Name 操做的對象名稱
二、查詢優化器評估信息
Rows(E-Rows) 預估操做返回的記錄條數
Bytes(E-Bytes) 預估操做返回的記錄字節數
TempSpc 預估操做使用臨時表空間的大小
Cost(%CPU) 預估操做所需的開銷。在括號中列出了CPU開銷的百分比。注意這些值是經過執行計劃計算出來的。換句話說,父操做的開銷包含子操做的開銷
Time 預估執行操做所須要的時間(HH:MM:SS)
三、分區(僅當訪問分區表時下列字段可見)
Pstart 訪問的第一個分區。若是解析時不知道是哪一個分區就設爲KEY,KEY(I),KEY(MC),KEY(OR),KEY(SQ)
Pstop 訪問的最後一個分區。若是解析時不知道是哪一個分區就設爲KEY,KEY(I),KEY(MC),KEY(OR),KEY(SQ)
四、並行和分佈式處理(僅當使用並行或分佈式操做時下列字段可見)
Inst 在分佈式操做中,指操做使用的數據庫連接的名字
TQ 在並行操做中,用於從屬線程間通訊的表隊列
IN-OUT 並行或分佈式操做間的關係
PQ Distrib 在並行操做中,生產者爲發送數據給消費者進行的分配
五、運行時統計(當設定參數statistics_level爲all或使用gather_plan_statistics提示時,下列字段可見)
Starts 指定操做執行的次數
A-Rows 操做返回的真實記錄數
A-Time 操做執行的真實時間(HH:MM:SS.FF)
六、I/O 統計(當設定參數statistics_level爲all或使用gather_plan_statistics提示時,下列字段可見)
Buffers 執行期間進行的邏輯讀操做數量
Reads 執行期間進行的物理讀操做數量
Writes 執行期間進行的物理寫操做數量
七、內存使用統計
OMem 最優執行所需內存的預估值
1Mem 一次經過(one-pass)執行所需內存的預估值
0/1/M 最優/一次經過/屢次經過(multipass)模式操做執行的次數
Used-Mem 最後一次執行時操做使用的內存量
Used-Tmp 最後一次執行時操做使用的臨時空間大小。這個字段必須擴大1024倍才能和其餘衡量內存的字段一致(好比,32k意味着32MB)
Max-Tmp 操做使用的最大臨時空間大小。這個字段必須擴大1024倍才能和其餘衡量內存的字段一致(好比,32k意味着32MB) sql
2、執行計劃中各模塊的描述與舉例
一、預估的執行計劃中的各字段與模塊 數據庫
SQL> explain plan for 2 select * from emp e,dept d 3 where e.deptno=d.deptno 4 and e.ename='SMITH'; Explained. /**************************************************/ /* Author: Robinson Cheng */ /* Blog: http://blog.csdn.net/robinson_0612 */ /* MSN: robinson_0612@hotmail.com */ /* QQ: 645746311 */ /**************************************************/ SQL> set linesize 180 SQL> set pagesize 0 SQL> select * from table(dbms_xplan.display(null,null,'advanced')); --使用dbms_xplan.display函數得到語句的執行計劃 Plan hash value: 351108634 --SQL語句的哈希植 ---------------------------------------------------------------------------------------- /*執行計劃部分*/ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 117 | 4 (0)| 00:00:01 | | 1 | NESTED LOOPS | | 1 | 117 | 4 (0)| 00:00:01 | |* 2 | TABLE ACCESS FULL | EMP | 1 | 87 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 30 | 1 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 | ---------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): --這部分顯示的爲查詢塊名和對象別名 ------------------------------------------------------------- 1 - SEL$1 --SEL$爲select 的縮寫,位於塊1,相應的還有DEL$,INS$,UPD$等 2 - SEL$1 / E@SEL$1 --E@SEL$1,對應到執行計劃中的操做ID爲2上,即在表E上的查詢,E爲別名,下面類同 3 - SEL$1 / D@SEL$1 4 - SEL$1 / D@SEL$1 Outline Data --提綱部分,這部分將執行計劃中的圖形化方式以文本形式來呈現,即轉換爲提示符方式 ------------- /*+ BEGIN_OUTLINE_DATA USE_NL(@"SEL$1" "D"@"SEL$1") --使用USE_NL提示,即嵌套循環 LEADING(@"SEL$1" "E"@"SEL$1" "D"@"SEL$1") --指明前導表 INDEX_RS_ASC(@"SEL$1" "D"@"SEL$1" ("DEPT"."DEPTNO")) --指明對於D上的訪問方式爲使用索引 FULL(@"SEL$1" "E"@"SEL$1") --指明對於E上的訪問方式爲全表掃描 OUTLINE_LEAF(@"SEL$1") ALL_ROWS OPTIMIZER_FEATURES_ENABLE('10.2.0.3') IGNORE_OPTIM_EMBEDDED_HINTS END_OUTLINE_DATA */ Predicate Information (identified by operation id): --謂詞信息部分,在執行計劃中ID帶有星號的每一行均對應到下面中的一行 --------------------------------------------------- 2 - filter("E"."ENAME"='SMITH') 4 - access("E"."DEPTNO"="D"."DEPTNO") Column Projection Information (identified by operation id): --執行時每一步驟所返回的列,下面的不一樣步驟返回了不一樣的列 ----------------------------------------------------------- 1 - (#keys=0) "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7], "E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22], "D"."DEPTNO"[NUMBER,22], "D"."DNAME"[VARCHAR2,14], "D"."LOC"[VARCHAR2,13] 2 - "E"."EMPNO"[NUMBER,22], "E"."ENAME"[VARCHAR2,10], "E"."JOB"[VARCHAR2,9], "E"."MGR"[NUMBER,22], "E"."HIREDATE"[DATE,7], "E"."SAL"[NUMBER,22], "E"."COMM"[NUMBER,22], "E"."DEPTNO"[NUMBER,22] 3 - "D"."DEPTNO"[NUMBER,22], "D"."DNAME"[VARCHAR2,14], "D"."LOC"[VARCHAR2,13] 4 - "D".ROWID[ROWID,10], "D"."DEPTNO"[NUMBER,22] Note --註釋與描述部分,下面的描述中給出了本次SQL語句使用了動態採樣功能 ----- - dynamic sampling used for this statement 58 rows selected.
二、實際執行計劃中的各字段與模塊 分佈式
SQL> select /*+ gather_plan_statistics */ * --注意此處增長了提示gather_plan_statistics而且該語句被執行 2 from emp e,dept d 3 where e.deptno=d.deptno 4 and e.ename='SMITH'; 7369 SMITH CLERK 7902 17-DEC-80 800 20 20 RESEARCH DALLAS SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats last')); --使用display_cursor獲取實際的執行計劃 SQL_ID fpx7zw59f405d, child number 0 --這部分給出了SQL語句的SQL_ID,子游標號以及原始的SQL語句 ------------------------------------- select /*+ gather_plan_statistics */ * from emp e,dept d where e.deptno=d.deptno and e.ename='SMITH' Plan hash value: 351108634 --SQL 語句的哈希值 --SQL語句的執行計劃,能夠看到下面顯示的字段一部分不一樣於預估執行計劃中的字段 ----------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | ----------------------------------------------------------------------------------------------------------- | 1 | NESTED LOOPS | | 1 | 1 | 1 |00:00:00.01 | 10 | 1 | |* 2 | TABLE ACCESS FULL | EMP | 1 | 1 | 1 |00:00:00.01 | 8 | 0 | | 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 1 | 1 |00:00:00.01 | 2 | 1 | |* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 1 | 1 |00:00:00.01 | 1 | 1 | ----------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("E"."ENAME"='SMITH') 4 - access("E"."DEPTNO"="D"."DEPTNO") Note ----- - dynamic sampling used for this statement 26 rows selected.
3、總結
由上可知,在不一樣的情形下能夠得到執行計劃的不一樣信息,而不一樣信息則展示了SQL語句對應的不一樣狀況,所以應根據具體的情形具體分析。 ide