嵌套循环连接(nested loops join)

访问次数:驱动表返回几条,被驱动表访问多少次。

驱动表是否有顺序:有。

是否要排序:否。

   应用场景:  1.关联中有一个表比较小;

2.被关联表的关联字段上有索引;

3.索引的键值不应该重复率很高。

如果你做过开发,就把它看成两层嵌套的for循环。

下面我们来做个实验:

SQL> create table test1 as select * from dba_objects where rownum <=100;

SQL> create table test2 as select * from dba_objects where rownum <=1000;
SQL> exec dbms_stats.gather_table_stats(user,'test1');

SQL> exec dbms_stats.gather_table_stats(user,'test2');

SQL> alter session set statistics_level=all;

SQL> select /*+leading(t1) use_nl(t2)*/count(*)
  2    from test1 t1, test2 t2
  3   where t1.object_id = t2.object_id;

  COUNT(*)

----------

       100

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

---------------------------------------------------------------------------------------------------------

SQL_ID  3v5gu7ppdsz67, child number 0

-------------------------------------

select /*+leading(t1) use_nl(t2)*/count(*)   from test1 t1, test2 t2  where

t1.object_id = t2.object_id

Plan hash value: 1459699139

----解释一下:

Starts为该sql执行的次数。

E-Rows为执行计划预计的行数。

A-Rows为实际返回的行数。A-Rows跟E-Rows做比较,就可以确定哪一步执行计划出了问题。
A-Time为每一步实际执行的时间(HH:MM:SS.FF),根据这一行可以知道该sql耗时在了哪个地方。
Buffers为每一步实际执行的逻辑读或一致性读。
Reads为物理读。
OMem、1Mem为执行所需的内存评估值,0Mem为最优执行模式所需内存的评估值,1Mem为one-pass模式所需内存的评估值。
0/1/M 为最优/one-pass/multipass执行的次数。
Used-Mem耗的内存

---------------------------------------------------------------------------------------

| Id  | Operation           | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |

---------------------------------------------------------------------------------------

|   1 |  SORT AGGREGATE     |       |      1 |      1 |      1 |00:00:00.01 |    1504 |

|   2 |   NESTED LOOPS      |       |      1 |    100 |    100 |00:00:00.01 |    1504 |

|   3 |    TABLE ACCESS FULL| TEST1 |      
|    100 |    100 |00:00:00.01 |       4 |

|*  4 |    TABLE ACCESS FULL| TEST2 |    
|      1 |    100 |00:00:00.01 |    1500 |

---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   4 - filter("T1"."OBJECT_ID"="T2"."OBJECT_ID")

SQL> select /*+leading(t1) use_nl(t2)*/count(*)
  2    from test1 t1, test2 t2
  3   where t1.object_id = t2.object_id
  4     and t1.object_id in (10, 11, 12);

  COUNT(*)

----------

         3

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

---------------------------------------------------------------------------------------------------------

SQL_ID  0skx6hyjtsncu, child number 0

-------------------------------------

select /*+leading(t1) use_nl(t2)*/count(*)   from test1 t1, test2 t2  where

t1.object_id = t2.object_id    and t1.object_id in (10, 11, 12)

---------------------------------------------------------------------------------------

| Id  | Operation           | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |

---------------------------------------------------------------------------------------

|   1 |  SORT AGGREGATE     |       |      1 |      1 |      1 |00:00:00.01 |      49 |

|   2 |   NESTED LOOPS      |       |      1 |      3 |      3 |00:00:00.01 |      49 |

|*  3 |    TABLE ACCESS FULL| TEST1 |      
|      3 |      3 |00:00:00.01 |       4 |

|*  4 |    TABLE ACCESS FULL| TEST2 |      
|      1 |      3 |00:00:00.01 |      45 |

---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   3 - filter(("T1"."OBJECT_ID"=10 OR "T1"."OBJECT_ID"=11 OR

              "T1"."OBJECT_ID"=12))

   4 - filter((INTERNAL_FUNCTION("T2"."OBJECT_ID") AND

              "T1"."OBJECT_ID"="T2"."OBJECT_ID"))

SQL> select /*+leading(t1) use_nl(t2)*/count(*)
  2    from test1 t1, test2 t2
  3   where t1.object_id = t2.object_id
  4     and t1.object_id =10;

  COUNT(*)

----------

         1

SQL> select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));

PLAN_TABLE_OUTPUT

---------------------------------------------------------------------------------------------------------

SQL_ID  24g0zhvczyf2h, child number 0

-------------------------------------

select /*+leading(t1) use_nl(t2)*/count(*)   from test1 t1, test2 t2  where

t1.object_id = t2.object_id    and t1.object_id =10

Plan hash value: 1459699139

---------------------------------------------------------------------------------------

| Id  | Operation           | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |

---------------------------------------------------------------------------------------

|   1 |  SORT AGGREGATE     |       |      1 |      1 |      1 |00:00:00.01 |      19 |

|   2 |   NESTED LOOPS      |       |      1 |      1 |      1 |00:00:00.01 |      19 |

|*  3 |    TABLE ACCESS FULL| TEST1 |      
|      1 |      1 |00:00:00.01 |       4 |

|*  4 |    TABLE ACCESS FULL| TEST2 |      
|      1 |      1 |00:00:00.01 |      15 |

---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   3 - filter("T1"."OBJECT_ID"=10)

   4 - filter("T2"."OBJECT_ID"=10)

嵌套循环连接(nested loops join)原理的更多相关文章

  1. 嵌套循环连接(Nested Loops Joins)

    The nested loops join, also called nested iteration, uses one join input as the outer input table(sh ...

  2. SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join

    nested loops join(嵌套循环)   驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...

  3. Nested Loops join时显示no join predicate原因分析以及解决办法

    本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...

  4. Merge join、Hash join、Nested loop join对比分析

    简介 我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join ...

  5. 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)

    简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...

  6. join中级篇---------hash join & merge join & nested loop Join

    嵌套循环连接(Nested Loop Join) 循环嵌套连接是最基本的连接,正如其名所示那样,需要进行循环嵌套,嵌套循环是三种方式中唯一支持不等式连接的方式,这种连接方式的过程可以简单的用下图展示: ...

  7. 三大表连接方式详解之Nested loop join和 Sort merge join

    在早期版本,Oracle提供的是nested-loop join,两表连接就相当于二重循环,假定两表分别有m行和n行       如果内循环是全表扫描,时间复杂度就是O(m*n)       如果内循 ...

  8. oracle多表连接方式Hash Join Nested Loop Join Merge Join

    在查看sql执行计划时,我们会发现表的连接方式有多种,本文对表的连接方式进行介绍以便更好看懂执行计划和理解sql执行原理. 一.连接方式:        嵌套循环(Nested  Loops (NL) ...

  9. oracle表连接------&gt;排序合并连接(Merge Sort Join)

    排序合并连接 (Sort Merge Join)是一种两个表在做连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的连接方法. 对于排序合并连接的优缺点及适用场景例如以下: a,通常 ...

随机推荐

  1. 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 456  Solved: 215[Submit][Stat ...

  2. HDU 5714 拍照 前缀和

    拍照 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5714 Description 小明在旅游的路上看到了一条美丽的河,河上有许多船只,有的船只向左 ...

  3. 基于直接最小二乘的椭圆拟合(Direct Least Squares Fitting of Ellipses)

    算法思想: 算法通过最小化约束条件4ac-b^2 = 1,最小化距离误差.利用最小二乘法进行求解,首先引入拉格朗日乘子算法获得等式组,然后求解等式组得到最优的拟合椭圆. 算法的优点: a.椭圆的特异性 ...

  4. 使用python解决烦人的每周邮件汇总!

    最近开始接手BI工作,其中又一个繁琐又不得不做的事,就是每周五都得汇总上个财务周的数据给运营人员! 作为一个懒人,只能把这件事交由电脑去处理了. 初步的idea:周五11点前mac自动执行汇总程序-& ...

  5. xarmain使用Forms编译android工程出现support_r19.0.1.zip支持包错误

    第一次使用xarain下载Forms程序,提示一下错误. C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.t ...

  6. jQuery制作水平多级下拉菜单

    本篇体验使用jQuery制作水平的.多级的.下拉菜单. 下拉菜单的html部分如下. <body> <nav class="main-nav"> <u ...

  7. 用Redis实现分布式锁以及redission使用

    原文:https://my.oschina.net/wangnian/blog/668830 前言:分布式环境有很多问题,比如你前一个请求访问的是服务器A,第二个请求访问到了服务器B,就会发生并发重复 ...

  8. #pragma mark 添加分割线 及 其它类似标记 - 转

    #pragma marks Comments containing: MARK: TODO: FIXME: !!!: ???: 除了使用 #pragma mark -添加分割线之外, 以上几种标记均可 ...

  9. Android Gradle Plugin指南(四)——測试

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing 5.Testing(測试) 构建一个測试 ...

  10. spring MVC 与 struts 的区别

    当初选框架的时候目的比较单纯---springmvc支持rest,小生对restful url由衷的喜欢 不用不知道一用就发现开发效率确实比struts2高 我们用struts2时采用的传统的配置文件 ...