深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join

深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join

分类: Oracle 基础管理 Oracle SQL 开发2013-01-28 00:33 2536人阅读 评论(1) 收藏 举报

系数据库技术的精髓就是通过关系表进行规范化的数据存储
       并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理
       这里Think愿意和大家一起来学习分享Oracle的三大表连接技术
       
       在早期版本,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就单独为它开在下一篇博客里头了

来源: <http://blog.csdn.net/dba_waterbin/article/details/8547451>

来自为知笔记(Wiz)

时间: 2024-12-24 05:33:43

深入理解Oracle表(3):三大表连接方式详解之Nested loop join和 Sort merge join的相关文章

深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图...

Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集       Hash Join的执行计划第1个是hash表(build table),第2个探查表(probe table),一般不叫内外表,nested loop才有内外表       Hash表也就是所谓的内表,探查表所谓的外表       两者的执行计划形如:       nested loop           outer table    

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

VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1.bridged(桥接模式)             选择桥接之后一定要重新启动主机的本地连接,否则桥接无法上网使用.这个问题可能出现在大部分人身上. 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下,你需要手工为虚拟系统配置 IP

Oracle 数据库启动与关闭 各种方式详解整理

概述 只有具备sysdba和sysoper系统特权的用户才能启动和关闭数据库. 在启动数据库之前应该启动监听程序,否则就不能利用命令方式来管理数据库,包括启动和关闭数据库. 虽然数据库正常运行,但如果没有启动监听程序,客户端就不能连接到数据库. 在oracle用户下: 启动监听程序 lsnrctl start 关闭监听程序lsnrctl stop 查询监听程序状态lsnrctl status startup 支持参数 STARTUP options | upgrade_options optio

多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点信息: 1.       CBO 使用的ALL_ROWS模式 Oracle Optimizer CBO RBO http://blog.csdn.NET/tianlesoftware/archive/2010/08/19/5824886.aspx 2.       表之间的连接用了hash Join

邻接表无向图(一)之 C语言详解

本章介绍邻接表无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现.实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法

快速理解VirtualBox的四种网络连接方式

VirtualBox中有4中网络连接方式: NAT Bridged Adapter Internal Host-only Adapter VMWare中有三种,其实他跟VMWare 的网络连接方式都是一样概念,只是比VMWare多了Internal方式. 要让自己(或别人)理解深刻,方法就是做比较和打比方,比较之间的不同和相同,拿熟知的事物打比方.先来一张图,通过这张图就很容易看出这4种方式的区别: (注:此图直接取至Finalbug的Blog,表示感谢) 再来用文字做详细的解释(其实归结起来就

Html5之高级-2 HTML5表单属性(属性介绍、属性详解)

一.属性介绍 属性介绍 - 有一些输入类型要求使用特定的属性才能显示效果,如前面提到过min,max,step. 其他输入类型需要使用一些属性来改进其他性能,或者决定验证过程的重要性.HTML5 标准中再原来的基础上增加了一些新的属性. - Placeholder 属性 - Nultiple 属性 - Autofocus 属性 - Form 属性 二.属性详解 Placeholder 属性 - Placeholder 属性通常用于search输入类型,也可以用在文本域.它表示一个简单提示.单词或

Sort merge join、Nested loops、Hash join(三种连接类型)

目前为止,典型的连接类型有3种: Sort merge join(SMJ排序-合并连接): 首先生产driving table需要的数据,然后对这些数据按照连接操作关联列进行排序:然后生产probed table需要的数据,然后对这些数据按照与driving table对应的连接操作列进行排序:最后两边已经排序的行被放在一起执行合并操作.排序是一个费时.费资源的操作,特别对于大表.所以smj通常不是一个特别有效的连接方法,但是如果driving table和probed table都已经预先排序

ORACLE EXPDP IMPDP数据导入导出命令详解及同EXP IMP命令详细对比

ORACLE EXPDP IMPDP数据导入导出命令详解及同EXP IMP 命令详细对比 一.EXPDP IMPDP EXP IMP 可以实现 1.可以实现逻辑备份和逻辑恢复 2.可以在数据库用户之间移动对象 3.可以在数据库之间移动对象 4.可以实现表空间转移 二.EXPDP的命令详解 C:\Users\Administrator>20:42:32.90>expdp help=y Export: Release 11.2.0.1.0 - Production on 星期六 10月 10 09