|
本帖最后由 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,完成查询;
|
|