在早期版本,Oracle提供的是nested-loop join,两表连接就相当于二重循环,假定两表分别有m行和n行
       如果内循环是全表扫描,时间复杂度就是O(m*n)
       如果内循环是索引扫描,时间复杂度就是O(m*㏒n)
       而hash join的时间复杂度是O(m*n)
       因此10g后,hash join成为缺省的连接方法
       
       对于三种连接,我们都可以使用hint来强制让优化器走:use_hash,use_nl,use_merge
       
       三大连接方法的大纲先列如下:
       
       nested loop
       从A表抽一条记录,遍历B表查找匹配记录,然后从a表抽下一条,遍历B表。。。
       就是一个二重循环
       
       hash join
       将A表按连接键计算出一个hash表,然后从B表一条条抽取记录,计算hash值,根据hash到A表的hash来匹配符合条件的记录
       
       sort merge join
       将A,B表都排好序,然后做merge,符合条件的选出
       
       接下来分别谈谈各种连接
       
       ㈠ Nested Loop Join
       
       ⑴ 执行原理
       例如:
       select t1.*,t2.* from t1,t2 where t1.col1=t2.col2;
       访问机制如下:
       for i in (select * from t1) loop
         for j in (select * from t2 where col2=i.col1) loop
         display results;
         end loop;
         end loop;
       类似一个嵌套循环
       嵌套循环执行时,先是外层循环进入内层循环,并在内层循环终止之后
       接着执行外层循环再由外层循环进入内层循环中,当外层循环全部终止时,程序结束
       
       ⑵ 步骤如下:
       
       ① 确定驱动表
       ② 把inner 表分配给驱动表
       ③ 针对驱动表的每一行,访问被驱动表的所有行
       
       ⑶执行计划大致如下:
       
       NESTED LOOPS
       outer_loop
       inner_loop
       
       优化器模式为FIRST_ROWS时,我们经常会发现有大量的NESTED LOOP
       这时,在返回数据给用户时,我们没有必要缓存任何数据,这是nested loop的一大亮点
       
       
       ⑷ 使用场景
          一般用在连接的表中有索引,并且索引选择性较好(也就是Selectivity接近1)的时候
          也就是驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index)
          需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的
          
       ⑸ 和索引的关系
       
          嵌套循环和索引就像一对孪生兄弟,一般需要共同考量与设计
          这从优化器的执行机制可以看出,比如,存在2张表,一个10条记录,一个1000万条记录
          以小表为驱动表,则代价为:10*(通过索引在大表查询一条记录的代价)
          如果1000万的大表没有索引的时候,那么COST的代价可想而知
          因此,在多表连接时,注意被驱动表的连接字段是否需要创建索引
          或者连接字段与该表的其他约束条件字段上是否需要创建复合索引
       
       
       ㈡ Sort Merge Join
          
          ⑴ 执行原理
          例如:
          select t1.*,t2.* from t1,t2 where t1.id=t2.id;
          访问机制如下:
          访问t1,并order by t1_1.id,这里的id代表连接字段
          访问t2,并order by t2_1.id
          join t1_1.id = t2_1.id,依次交替 比对 归并,但无所谓驱动
          
     
          
          ⑵ 使用场景
             虽说,hash join就是用来替代sj的,但如果你的服务器的CPU资源和MEM资源都很紧张的时候,建议用SORT MERGE JOIN
             因为hash join比sort merge join需要的资源更多。特别是cpu
             10g sql tuning 文档上写道:
             On the other hand, sort-merge joins can perform better than hash joins if both of the following conditions are met:
             The row sources are already sorted. 
             A sort operation does not have to be done.
             所以,sj大概就用在没有索引,并且数据已经排序的情况
         
       由于hash join比较重要也比较难理解,所以这里Think就单独为它开在下一篇博客里头了

三大表连接方式详解之Nested loop join和 Sort merge join的更多相关文章

  1. Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join

    关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理. 表的三种关联方式: nested loop:从A表抽一条记录,遍历B表查找匹配 ...

  2. Nested Loops,Hash Join 和 Sort Merge Join. 三种不同连接的不同:

    原文:https://blog.csdn.net/tianlesoftware/article/details/5826546 Nested Loops,Hash Join 和 Sort Merge ...

  3. Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)

    nested loop 嵌套循环(原理):oracle从较小结果集(驱动表.也可以被称为outer)中读取一行,然后和较大结果集(被侦查表,也可以叫做inner)中的所有数据逐条进行比较(也是等值连接 ...

  4. VMware 虚拟机的网络连接方式详解

         VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作 ...

  5. Docker Daemon 连接方式详解

    前言 在 Docker 常用详解指令 一文中粗粗提了一下, Docker 是分为客户端和服务端两部分的, 本文将介绍客户端是如何连接服务端的. 连接方式 1. UNIX域套接字 默认就是这种方式, 会 ...

  6. VirtualBox的四种网络连接方式详解

    VirtualBox中有4中网络连接方式: 1. NAT 2. Bridged Adapter 3. Internal 4. Host-only Adapter VMWare中有三种,其实他跟VMWa ...

  7. [转]VirtualBox中的网络连接方式详解

    如果出现主机无法ping通虚拟机的情况,请首先确认虚拟机防火墙已关闭. 一.NAT模式 特点: 1.如果主机可以上网,虚拟机可以上网 2.虚拟机之间不能ping通 3.虚拟机可以ping通主机(此时p ...

  8. NESTED LOOPS & HASH JOIN & SORT MERGE JOIN

    表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...

  9. 多表连接的三种方式详解 hash join、merge join、 nested loop

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...

随机推荐

  1. Codeforces Round #449

    960  asteri 1384     492 00:04 -1 892 01:33     960 PEPElotas 1384     488 00:06 896 00:26       960 ...

  2. javaweb 之 代理模式

    一.动态代理 1.1.代理模式 什么是代理模式及其作用 Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问 ...

  3. c++ 编译期与运行期

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 转自:http://h ...

  4. Jetty容器配置https

    Configuring the Jetty Container as a Https Connector Jetty版本:9.2.22.v20170606 Pom.xml <?xml versi ...

  5. FAQ: SBS 2011. The Windows SBS Manager service terminated unexpectedly

    Symptoms The Windows SBS Manager service is stopped with EventID 7034 every half an hour on SBS 2011 ...

  6. 配置H3C交换机ftp服务

    配置H3C交换机ftp服务,用于与交换机进行文件上传.下载,常用于更新程序上传及配置备份文件下载. 准备工作:三层设备(路由器.三层交换机等)至少一个接口配置IP,二层交换机需配置一个处于UP状态的v ...

  7. spring cloud(四) feign

    spring cloud 使用feign进行服务间调用 1. 新建boot工程 pom引入依赖 <dependency> <groupId>org.springframewor ...

  8. 路飞学城Python-Day142

    第2节:UA身份伪装 反爬机制 User-Agent:请求载体的身份标识 通过不同的手段的当前的请求载体是不一样的,请求信息也是不一样的,常见的请求信息都是以键和值的形式存在 浏览器的开发者工具 Ne ...

  9. JsonNetResult

    public class JsonNetResult : JsonResult { public JsonNetResult() { Settings = new JsonSerializerSett ...

  10. 如何检查Windows网络通信端口占用

    最近本地测试jsp程序发现tomcat启动失败,无法监听8080端口,也没记得别的什么程序占用了8080端口,干脆就改成了8090端口先用着.今天找了找Windows上查看网络通信端口占用的方法. 先 ...