概述
嵌套循环(Nested Loops (NL))
假如有A、B两张表进行嵌套循环连接,那么Oracle会首先从A表中提取一条记录,然后去B表中查找相应的匹配记录,如果有的话,就把该条记录的信息推到等待返回的结果集中,然后再去从A表中提取第二条记录,去在B表中找第二条匹配的记录,如果符合就推到返回的结果集中,依次类推,直到A表中的数据全部被处理完成,将结果集返回,就完成了嵌套循环连接的操作。在这种情况 A表要去B表查询的记录越少,性能越高。如果A表有很多要去B表查询,那么不建议用Nested Loops 了。
有位老师曾经这样形容Nested Loops和HasH Join
Nested Loops:2个班的同学选舞伴,男班人数少,女班人数多,这个时候最好的方法就是人少的男班一个一个的去女班挑选舞伴。这样最快。
HasH Join:个班的同学选舞伴,男班人数和女班人数差不多,放任男班或者女班的人去一个一个的选,这样太浪费时候,不如男班和女班各自集合起来,然后2个班级集合后选。
在做下面的实验前,我先解释下一些名词
Driving Table(驱动表):该表又称为外层表(OUTER TABLE)。这个概念用于嵌套与HASH连接中。如果该row source返回较多的行数据,则对所有的后续操作有负面影响。注意此处虽然翻译为驱动表,但实际上翻译为驱动行源(driving row source)更为确切。一般说来,是应用查询的限制条件后,返回较少行源的表作为驱动表,所以如果一个大表在WHERE条件有有限制条件(如等值限 制),则该大表作为驱动表也是合适的,所以并不是只有较小的表可以作为驱动表,正确说法应该为应用查询的限制条件后,返回较少行源的表作为驱动表。在执行 计划中,应该为靠上的那个row source,后面会给出具体说明。在我们后面的描述中,一般将该表称为连接操作的row source 1.
Probed Table(被探查表):该表又称为内层表(INNER TABLE)。在我们从驱动表中得到具体一行的数据后,在该表中寻找符合连接条件的行。所以该表应当为大表(实际上应该为返回较大row source的表)且相应的列上应该有索引。在我们后面的描述中,一般将该表称为连接操作的row source 2.
/*+ leading(t1) use_nl(t2)*/ --这里的意思是 驱动表用t1,用Nested Loops方式连接被探查表T2
今天只不讨论外关联,以后会和大家讨论的。(图片由于要现实全,所以缩小了,大家看清楚文件,直接打开图片看)
通过上面的方式,大家应该能读懂(Nested Loops)的方式了吧,在后面内容里面,我还将继续
和大家探讨这个问题。
SELECT /*+ leading(t1) use_nl(t2) */ * FROM t1, t2 WHERE t1.id < t2.t1_id AND t1.n = 19;
alter session set statistics_level=all;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
最后
以上就是殷勤吐司为你收集整理的oracle执行计划-Nested Loops (nl)-1的全部内容,希望文章能够帮你解决oracle执行计划-Nested Loops (nl)-1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复