ITPub博客

首页 > 数据库 > Oracle > 执行计划详解

执行计划详解

原创 Oracle 作者:czxin788 时间:2015-05-07 22:39:26 0 删除 编辑

执行计划的查看经典版

 

 

 

上面的SQL*Net roundtrips to/from client ---表示通过网络(SQL*Net)往返(round)几次的意思;

上面这句表示服务器到客户端发送了多少字节。

 

上面这句表示客户端到服务器端发送了多少字节。

 

redo size----表示产生的日志多少(普通的查询是不产生日志的,但是有些特殊查询也是产生日志的)。

 

 

上面表示的是递归调用。oracle在执行select count(*) from tt这条sql语句时,oracle还要执行其他的sql,用来解释select count(*) from tt这条sql(我们写的sql语句只是一个文本的,但oracle需要对你写的sql语句进行编译,使之成为计算机识别的符号才能执行)。

oracle是怎么解释你写的sql语句呢?其实oracle是通过查数据字典、元数据来解释的,这时是需要cpu资源:

1)      判断对象(表)是否存在

2)      判断是否权限访问

3)      判断sql是否与语法错误

上面这三条sql语句的解释都称之为递归调用。

 

 

 

上面的consistent gets和physical reads是真正执行sql语句消耗的资源。

 

其中,

consistent gets,表示逻辑读,即从内存中访问数据块的次数。如果一个数据块访问了9087次,那么逻辑读就是9087;如果每一个数据块只访问过一次,但访问了9087个块,那么逻辑读也是9087。

其实我们优化sql语句的目的就是降低consistent gets。

 

physical reads,表示物理读。说明内存太小了,需要访问的数据块完全没有在内存中保留下来,还得需要从磁盘来读取所需要的数据块。这意味这条sql语句访问时,data buffer 空间不够,不能把这个表涉及到数据块全部放在data buffer cache中来。

执行计划查看的规则:

1、首先查看缩进最靠右侧的执行计划 ------>最先执行

2、同等级缩进的执行计划,从上倒下执行

3、父子关系,如果有孩子先执行孩子,在执行父亲

 

执行计划的案例分析

 

第一个案例

上面的sort aggregate是排序聚合的意思,即表示的就是count()这个函数的动作。

select statement表示把最后的结果返回给用户。

 

第二个案例

 

从上图可看出,此计划是一个二叉树,有两个分支,分别为上图的1和2

 

小知识:一个表的大小由哪些因素来决定呢?

假设一个表很大,可能是这个表有很多字段,每个字段都很宽导致的表大;另一个可能是这个表的数据量很大。

 

小知识:一个表里面的字段不能太多,oracle允许一个表里面最多能达到一千个字段。但是最好一张表不要超过256个字段。

 

小知识:我们在修改一个字段的数据时,oracle会把这个字段所在的行锁住,其他人就不再能修改这行的所有字段,直到这个人把行锁释放为止。所以一个表不要把字段设置的太多,否则行锁锁表的面积就会很大,从而导致数据库瓶颈。

 

下图演示的就是一个人在修改某一行的一个字段的值时,这行数据就被锁住,别人就操作不了这行数据了。所以如果一个表的字段越多,那么发生行锁的几率也就越大。因为可能很多人都要修改这行数据的不同字段,从而导致行锁。

 

 

 

查看执行计划的步骤:

1)

查看缩进最靠右侧的执行计划是6和7

2)

执行计划同一缩进计划,按照从上倒下的顺序执行,执行顺序为上图所示,先执行1在执行2

 

3)

按照执行计划规则,先执行孩子,在执行父亲,上图所示:6 、7是5的孩子

所以先执行6和7再执行5,执行顺序为6、7、5

 

4)

 

上图所示 5和 8 是同一等级缩进,先执行5 再执行8。  3)说明5已经执行完

执行8, 8为父亲,下面还有孩子,所以先执行孩子 9,再执行8

执行顺序为 6、7、5、9、8

 

5)

上图所示:6、7、5、9、8已经执行完。4是6、7、5、9、8的父亲,孩子执行完,执行父亲,所以在执行4,顺序为 6、7、5、9、8、4

6)

 

 

上图所示:4和10 是同一等级缩进,4执行完成,在执行10

 

7)

 

上图所示:10 是11、12的父亲,所以先执行孩子,11 和12 是同一等级,按照从上倒下顺序执行,先执行11,在执行12 ,但是12又是13的父亲,所以先执行13,在执行12

 

以上顺序为:6、7、5、9、8、4、11、13、12、10

 

 

上图所示:按照执行计划原则,缩进最靠右侧的先执行,执行为 3、2、1

 

 

综上图解:

执行计划顺序为

6、7、5、9、8、4、11、13、12、10、3、2、1、0

综上所述图解:

下面我们就可以将执行计划画成一个二叉树。

 

 

hash value

 

 

上面表示set autot trace显示的执行计划,其实是从v$sql_plan里面构造出来的。

v$sql_plan视图中,上面这两列可以轻松的看出父子关系。





附件列表

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28916011/viewspace-1628909/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-06-03

  • 博文量
    233
  • 访问量
    858459