执行计划详解

执行计划的查看经典版

 

 

28916011_1431009304ezE8.png

 

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

28916011_14310093095FKk.png

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

 

28916011_1431009310fkU5.png

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

 

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

 

28916011_1431009310dvp8.png

 

上面表示的是递归调用。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语句的解释都称之为递归调用。

 

 

 

28916011_1431009312nqWG.png

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

 

其中,

28916011_143100931682B1.png

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

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

 

28916011_1431009319wJw6.png

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

执行计划查看的规则:

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

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

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

 

执行计划的案例分析

 

第一个案例

28916011_1431009339nUJ8.png

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

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

 

第二个案例

28916011_1431009347PNfv.jpg

 

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

 

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

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

 

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

 

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

 

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

28916011_143100934919I9.png

 

 

 

查看执行计划的步骤:

28916011_1431009350chcE.png

1

28916011_1431009362777B.jpg

查看缩进最靠右侧的执行计划是67

2

28916011_1431009365HxkR.jpg

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

 

3

28916011_1431009376Jk1y.jpg

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

所以先执行67再执行5,执行顺序为675

 

4

28916011_1431009390WccX.jpg

 

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

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

执行顺序为 67598

 

5

28916011_1431009394R2jn.jpg

上图所示:67598已经执行完。467598的父亲,孩子执行完,执行父亲,所以在执行4,顺序为 675984

6

 

28916011_1431009401QhGQ.jpg

 

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

 

7

28916011_1431009413xWqg.jpg

 

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

 

以上顺序为:67598411131210

 

28916011_14310094172T93.jpg

 

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

 

 

综上图解:

执行计划顺序为

675984111312103210

综上所述图解:

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

28916011_14310094216Amv.jpg

 

 

hash value

28916011_1431009445NV00.jpg

 

28916011_143100945955F8.jpg

 

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

28916011_14310094713Gd8.png

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





附件列表

 

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

转载于:http://blog.itpub.net/28916011/viewspace-1628909/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值