执行计划中各字段各模块描述

在SQL语句的执行计划中,包含很多字段项和很多模块,其不同字段代表了不同的含义且在不同的情形下某些字段、模块显示或不显示,下

面的描述给出了执行计划中各字段的含义以及各模块的描述。

有关执行计划中各字段模块的描述请参考: 执行计划中各字段各模块描述
       有关由SQL语句来获取执行计划请参考:     使用 EXPLAIN PLAN 获取SQL语句执行计划
       有关使用autotrace来获取执行计划请参考:启用 AUTOTRACE 功能
       有关display_cursor函数的使用请参考:      dbms_xplan之display_cursor函数的使用

一、执行计划中各字段的描述
  1、基本字段(总是可用的)
        Id              执行计划中每一个操作(行)的标识符。如果数字前面带有星号,意味着将在随后提供这行包含的谓词信息
        Operation  对应执行的操作。也叫行源操作
        Name        操作的对象名称
  
  2、查询优化器评估信息
        Rows(E-Rows)    预估操作返回的记录条数
        Bytes(E-Bytes)    预估操作返回的记录字节数
        TempSpc            预估操作使用临时表空间的大小
        Cost(%CPU)        预估操作所需的开销。在括号中列出了CPU开销的百分比。注意这些值是通过执行计划计算出来的。换句话说,父操作的开销包含子操作的开销
        Time                   预估执行操作所需要的时间(HH:MM:SS)
  
  3、分区(仅当访问分区表时下列字段可见)
    Pstart        访问的第一个分区。如果解析时不知道是哪个分区就设为KEY,KEY(I),KEY(MC),KEY(OR),KEY(SQ)
    Pstop        访问的最后一个分区。如果解析时不知道是哪个分区就设为KEY,KEY(I),KEY(MC),KEY(OR),KEY(SQ)
  
  4、并行和分布式处理(仅当使用并行或分布式操作时下列字段可见)
        Inst        在分布式操作中,指操作使用的数据库链接的名字
        TQ         在并行操作中,用于从属线程间通信的表队列
        IN-OUT          并行或分布式操作间的关系
        PQ Distrib     在并行操作中,生产者为发送数据给消费者进行的分配
  
  5、运行时统计(当设定参数statistics_level为all或使用gather_plan_statistics提示时,下列字段可见)
        Starts         指定操作执行的次数
        A-Rows     操作返回的真实记录数
        A-Time      操作执行的真实时间(HH:MM:SS.FF)
  
  6、I/O 统计(当设定参数statistics_level为all或使用gather_plan_statistics提示时,下列字段可见)
        Buffers     执行期间进行的逻辑读操作数量
        Reads      执行期间进行的物理读操作数量
        Writes      执行期间进行的物理写操作数量        
  
  7、内存使用统计
        OMem        最优执行所需内存的预估值
        1Mem         一次通过(one-pass)执行所需内存的预估值
        0/1/M          最优/一次通过/多次通过(multipass)模式操作执行的次数
        Used-Mem       最后一次执行时操作使用的内存量
        Used-Tmp        最后一次执行时操作使用的临时空间大小。这个字段必须扩大1024倍才能和其他衡量内存的字段一致(比如,32k意味着32MB)
        Max-Tmp           操作使用的最大临时空间大小。这个字段必须扩大1024倍才能和其他衡量内存的字段一致(比如,32k意味着32MB)

二、执行计划中各模块的描述与举例
  1、预估的执行计划中的各字段与模块

[sql]

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:    [email protected]              */
/* 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 / [email protected]$1          [email protected]$1,对应到执行计划中的操作ID为2上,即在表E上的查询,E为别名,下面类同
   3 - SEL$1 / [email protected]$1
   4 - SEL$1 / [email protected]$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.

2、实际执行计划中的各字段与模块

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.

三、总结
      由上可知,在不同的情形下可以获得执行计划的不同信息,而不同信息则展现了SQL语句对应的不同情况,因此应根据具体的情形具体分析。

时间: 2024-07-31 06:33:25

执行计划中各字段各模块描述的相关文章

MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

  关于如何理解MySQL执行计划中Extra列的Using where.Using Index.Using index condition,Using index,Using where这四者的区别.首先,我们来看看官方文档关于三者的简单介绍(官方文档并没有介绍Using index,Using where这种情况): Using index (JSON property: using_index) The column information is retrieved from the ta

解读EXPLAIN执行计划中的key_len(转)

原文:http://imysql.com/2015/10/20/mysql-faq-key-len-in-explain.shtml 导读 EXPLAIN中的key_len一列表示什么意思,该如何解读? EXPLAIN执行计划中有一列 key_len 用于表示本次查询中,所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列被选择了.key_len越短越好,说白了就是字段类型越短越好 在这里 key_len 大小的计算规则是: 一般地,key_len 等于索引列类型字节长度,例如int类

[转载] EXPLAIN执行计划中要重点关注哪些要素

原文: https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=400738936&idx=1&sn=2910b4119b9943bafdcfe950dc89e028&scene=0&uin=Mjk1ODMyNTYyMg%3D%3D&key=04dce534b3b035ef3da41c55e69b6792390d87f8207be3e924d28fab0b6ac41a02549bf7410a7849c9f2

浅析SQL SERVER执行计划中的各类怪相

在查看执行计划或调优过程中,执行计划里面有些现象总会让人有些疑惑不解: 1:为什么同一条SQL语句有时候会走索引查找,有时候SQL脚本又不走索引查找,反而走全表扫描? 2:同一条SQL语句,查询条件的取值不同,它的执行计划会一致吗? 3: 同一条SQL语句,其执行计划会变化,为什么 4: 在查询条件的某个或几个字段上创建了索引,执行计划就一定会走该索引吗? 5:同时存在几个索引,SQL语句会走那个索引? ..............................................

EXPLAIN执行计划中要重点关注哪些要素(叶金荣)

原文:http://mp.weixin.qq.com/s/CDKN_nPcIjzA_U5-xwAE5w 导读 EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息. 总的来说,我们只需要关注结果中的几列: 列名 备注 type 本次查询表联接类型,从这里可以看到本次查询大概的效率 key 最终选择的索引,如果没有索引的话,本次查询效率通常很差 key_len 本次查询用于结果过滤的索引实际长度

SQL Server 执行计划中的扫描方式举例说明

原文地址:http://www.cnblogs.com/zihunqingxin/p/3201155.html 1.执行计划使用方式 选中需要执行的语句,点击Ctrl+L执行 2.示例student表,id,name,addressid上建立聚集索引Name建索引address无索引 3.区别1. [Table Scan]:遍历整个表,查找所有匹配的记录行.这个操作将会一行一行的检查,当然,效率也是最差的.以无索引字段为条件,按存放顺序一个个查,where address='123' 2. [I

执行计划中cost计算方法

概念: blevel:二元高度=索引高度-1 clustering_factor:集群因子,扫描index scan得出的要扫描的表中block数,clustering_factor<=table blocks 索引扫描的计算公式: cost = blevel + ceil(leaf_blocks *effective index selectivity) + ceil(clustering_factor * effective table selectivity) SQL> select l

也谈SQL Server 2008 处理隐式数据类型转换在执行计划中的增强

在 SQL Server 查询中,不经意思的隐匿数据类型转换可能导致极大的查询性能问题,比如一个看起来没有任何问题简单的条件:WHERE c = N'x' ,如果 c 的数据类型是 varchar,并且表中包含大量的数据,这个查询可能导致极大的性能开销,因为这个操作会导致列 c 的数据类型转换为 nvarchar与常量值匹配,在 SQL Server 2008 及之后的版本中,这种操作做了增强,一定程度上降低了性能开销,参考SQL Server 2008 处理隐式数据类型转换在执行计划中的增强

执行计划中常见index访问方式(转)

近期有朋友对于单个表上的index各种情况比较模糊,这里对于单个表上,单个index出现的大多数情况进行了总结性测试,给出了测试结果,至于为什么出现这样的试验结果未做过多解释,给读者留下思考的空间.本篇文章仅仅是为了测试hint对index的影响,而不是说明走各种index方式的好坏.参考: INDEX FULL SCAN vs INDEX FAST FULL SCAN创建表模拟测试 SQL> create table t_xifenfei as select object_id,object_