在早期版本,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. 使用asp.net 开发的一个东平人才网招聘程序

    本人用asp.net 工作已经一两年时间了,在单位一般是做管理系统类的开发,针对的客户大都是政府机关,所以都是内网系统,虽然有成就感,但是无法再互联网上展示.虽然技术一般,但还是希望自己做一个网站在互 ...

  2. Android studio 隐藏toolbar上的app title

    getSupportActionBar().setDisplayShowTitleEnabled(false);

  3. How to share memory between services and user processes?

    除了必要的InitializeSecurityDescriptor和SetSecurityDescriptorDacl, 内存映射文件名必须GLOBAL开头.

  4. 数据仓库模型建设基础及kimball建模方法总结

    观察数据的角度称之为维.决策数据市多为数据,多维数据分析是决策分析的组要内容. OLAP是在OLTP的基础上发展起来的,OLTP是以数据库为基础的,面对的是操作人员和底层管理人员,对基本数据进行查询和 ...

  5. (转载)TNSPING命令

    Oracle Net 工具(命令)tnsping,是一个OSI会话层的工具,它用来: 1)验证名字解析(name resolution,当然是oracle自己的网络服务名) 2)远程的listener ...

  6. 使用Eric构建Caffe应用程序-Baby年龄识别

    训练好的Caffe网络结构,可以固定下来,直接载入程序作为数据库接口使用.本文使用Eric构建运行于Python环境下的图片识别应用程序,因为Eric使用QT作为GUI,且有Python的接口,可直接 ...

  7. form 表单的另类触发方式:报错触发

    在用form表单提交的时候,遇到一个问题:表单未验证完,表单就提前提交了. 然后通过断点调试,发现form提交会因为函数报错提前提交. 即如果你的form提交过程中,没有执行到return true之 ...

  8. python网络编程part1

    1. 网络架构 单机 单机游戏 以下两个基于网络的 CS架构 客户端游戏 cs--->client客户/server服务 你自己是客户端(消费)--->服务端(收钱) 服务端(应用程序)一 ...

  9. SQL2012安装

    SQL2012安装 1.打开SQL安装包,点击setup安装 2.选择安装界面,点击全新安装 3.验证通过后,点击确定 4.选择我接受,点击下一步 5.在外网环境,可进行在线更新,内网环境取消勾选产品 ...

  10. zabbix监控超详细搭建过程(转)

    监控及zabbix 目录: 1       监控分类... 1 1.1        硬件监控... 1 1.2        系统监控... 2 1.3        网络监控... 3 1.4   ...