123
返回列表 发新帖
楼主: yanxiao_12

[性能调整] nested loop执行计划分析

[复制链接]
论坛徽章:
0
21#
 楼主| 发表于 2017-7-19 15:29 | 只看该作者
carcase 发表于 2017-7-19 09:24
这个是oracle的11g新特性造成的
新内部优化算法Batching NLJ对执行计划的影响
如果你关掉这个新特性,执 ...

按照你说的这两个隐含参数,我实验了,结果确实如你说写的一样。但是,oracle11g新特性中批量处理的过程是什么?在你贴出的这个图,能否给一个简单的解释,我这有些困惑?感觉自己好愚钝谢谢了

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-02-22 15:16:26
22#
发表于 2017-7-19 16:34 | 只看该作者
yanxiao_12 发表于 2017-7-19 15:22
谢谢指点,感觉我有点愚钝,针对oracle11g的这个新特性,现在还有些疑问:
1、如你所说,oracle11g为了 ...

1.具体矢量IO的原理是什么我也不清楚,从它字面上的理解就是批量回表,oracle标记当前需要回表的rowed是否在相同块,是的话只需要一次物理读取;这样减少每次ROWID都回表一次,减少物理IO读;
2.返回的是dept表满足条件的row和emp表满足条件的rowid

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-02-22 15:16:26
23#
发表于 2017-7-19 16:36 | 只看该作者
如果你想深入了解下oracle11g的执行计划及原理,可以看看崔华老师的《基于Oracle的SQL优化》

使用道具 举报

回复
论坛徽章:
0
24#
 楼主| 发表于 2017-7-19 17:18 | 只看该作者
latch_free 发表于 2017-7-19 16:36
如果你想深入了解下oracle11g的执行计划及原理,可以看看崔华老师的《基于Oracle的SQL优化》

好的,正在学习oracle优化,谢谢指引

使用道具 举报

回复
论坛徽章:
0
25#
 楼主| 发表于 2017-7-19 18:29 | 只看该作者
latch_free 发表于 2017-7-19 16:34
1.具体矢量IO的原理是什么我也不清楚,从它字面上的理解就是批量回表,oracle标记当前需要回表的rowed是 ...

在官方文档,我看到原文这么解释,有句话(红色标出)不是很理解:



使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-02-22 15:16:26
26#
发表于 2017-7-19 19:06 | 只看该作者
yanxiao_12 发表于 2017-7-19 18:29
在官方文档,我看到原文这么解释,有句话(红色标出)不是很理解:

大致的意思是如果内部表每次返回的记录比较多,即通过nest loops访问的方式效率不高(index),那么还是使用hash join比较合适;这个很好理解如果驱动表结果集较大或者通过nest loop每次被驱动表返回的数据较多,还不如使用hash连接;

使用道具 举报

回复
论坛徽章:
0
27#
 楼主| 发表于 2017-7-19 22:03 | 只看该作者
本帖最后由 yanxiao_12 于 2017-7-19 22:05 编辑

经过各位的反馈和官方文档查询,总结如下:
一、在oracle11g NLJ新特性之前,查询如下:select /*+ RULE */ * from scott.emp, scott.dept where scott.emp.deptno= scott.dept.deptno and scott.emp.comm is null and scott.dept.dname!= 'SALES';
         
        在该嵌套循环中,外层对EMP进行全表扫描,返回符合“comm is null”的结果集;内层根据deptno的连接关系进行DEPT表的检索,最后做一个回表;
     注:
          1、在嵌套循环中,如果被驱动表的连接存在索引,则oracle在访问时,通常采取单块读取;简而言之,驱动表的结果集有多少记录,oracle就需要做多少次单块读取索引访问,导致大量物理IO;
          2、如果目标SQL查询的列不能全部从被驱动表的相关索引中获取,那么oracle在做完嵌套循环后需要被驱动表做回表操作,同样是多少级结果集,oracle进行多少次回表操作,导致大量物理IO;

二、在oracle11g中,为了提高执行效率,引入了向量IO(Vector I/O),即将原先一批单块读取所需要耗费物理IO组合起来,然后用一个向量IO去批量处理;
        
       在该嵌套循环中,内循环返回EMP和DEPT的ROWID,然后作为外循环的驱动表,去向量读取DEPT,完成查询;


使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表