有关执行计划中各字段模块的描述请参考: 执行计划中各字段各模块描述
有关由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