看懂PL/SQL执行计划的显示结果

来源:互联网 发布:卤素灯 led 对比 知乎 编辑:程序博客网 时间:2024/04/27 16:57





统计信息解释:

recursive calls          

递归调用,有时为了执行用户发出的一个sql语句,Oracle必须执行一些额外的语句,我们将这些额外的语句称之为''recursive                                           calls''或''recursive SQL statements'',如当一个DDL语句发出后,ORACLE总是隐含的发出一些recursive SQL语句,来修改数据字典信息,以便用户可以成功的执行sql语句。

db block gets           

从buffer cache中读取的block的数量当前请求的块数目,当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的正常情况下,一个查询提取的块是在查询查询开始的那个时间点上存在的数据库,当前块是在这个时候存在数据块,而不是这个时间点之前或者之后的的数据块数目。

consistent gets          

从buffer cache中读取的undo数据的block的数量数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块,,这里的概念是在你处理你这个操作的时侯需要在一致性读状态上处理多个块,这些块产生的主要原因是因为你在查询过程中,由于其它会话对数据 块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所要需要对回滚 段中的数据块的前映像进行查询,以保证数据的一致性。这样就产生了一致性读。

 

physical reads          

 物理读 就是从磁盘上读取数据块的数量。其产生的主要原因是:

                  1:在数据库高速缓存中不存在这些块。

                  2:全表扫描

                  3:磁盘排序

redo size              

DML生成的redo的大小

sorts (memory)           

在内存执行的排序量

sorts (disk)             

在磁盘执行的排序量

2091 bytes sent via SQL*Net to client    

从SQL*Net向客户端发送了2091字节的数据

416 bytes received via SQL*Net from client  

客户端向SQL*Net发送了416字节的数据。

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

参考文档:SQLPlus User’s Guide and Reference Release 11.1

clip_image018

db block gets 、 consistent gets 、 physical reads这三者的关系可以概括为:逻辑读指的是ORACLE从内存读到的数据块块数量,一般来说是:

consistent gets + db block gets. 当在内存中找不到所需要的数据块的话,就需要从磁盘中获取,于是就产生了物理读。

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

 Plan hash Value

这一行是这一条语句的的hash值,我们知道ORACLE对每一条ORACLE语句产生的执行计划放在SHARE POOL里面,第一次要经过硬解析,产生hash值。下次再执行时比较hash值,如果相同就不会执行硬解析。

 COST

COST没有单位,是一个相对值,是SQL以CBO方式解析执行计划时,供ORACLE来评估CBO成本,选择执行计划用的。没有明确的含义,但是在对比是就非常有用。

公式:COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/ Sreadtim

 

 对上面执行计划列字段的解释:

Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)

    Operation:当前操作的内容。

    Name:操作对象

    Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。

    Bytes:表示执行该步骤后返回的字节数。

    Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。

    Time:Oracle 估计当前操作的时间。

谓词说明:

Predicate Information (identified by operation id):

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

2 - filter("B"."MGR" IS NOT NULL)

4 - access("A"."EMPNO" = "B"."MGR")

    Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。

    Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。

    在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。

动态分析

如果在执行计划中有如下提示:

Note

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

-dynamic sampling used for the statement

这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。我们从而推断这个表可能没有做过分析。

这里会出现两种情况:

(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。

(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

摘录自:
作者:潇湘隐者
出处:http://www.cnblogs.com/kerrycode/


0 0
原创粉丝点击