三大表连接方式详解之Nested loop join和 Sort merge join
在早期版本,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的更多相关文章
- Oracle 表的连接方式(1)-----Nested loop join和 Sort merge join
关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理. 表的三种关联方式: nested loop:从A表抽一条记录,遍历B表查找匹配 ...
- Nested Loops,Hash Join 和 Sort Merge Join. 三种不同连接的不同:
原文:https://blog.csdn.net/tianlesoftware/article/details/5826546 Nested Loops,Hash Join 和 Sort Merge ...
- Nested loops、Hash join、Sort merge join(三种连接类型原理、使用要点)
nested loop 嵌套循环(原理):oracle从较小结果集(驱动表.也可以被称为outer)中读取一行,然后和较大结果集(被侦查表,也可以叫做inner)中的所有数据逐条进行比较(也是等值连接 ...
- VMware 虚拟机的网络连接方式详解
VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作 ...
- Docker Daemon 连接方式详解
前言 在 Docker 常用详解指令 一文中粗粗提了一下, Docker 是分为客户端和服务端两部分的, 本文将介绍客户端是如何连接服务端的. 连接方式 1. UNIX域套接字 默认就是这种方式, 会 ...
- VirtualBox的四种网络连接方式详解
VirtualBox中有4中网络连接方式: 1. NAT 2. Bridged Adapter 3. Internal 4. Host-only Adapter VMWare中有三种,其实他跟VMWa ...
- [转]VirtualBox中的网络连接方式详解
如果出现主机无法ping通虚拟机的情况,请首先确认虚拟机防火墙已关闭. 一.NAT模式 特点: 1.如果主机可以上网,虚拟机可以上网 2.虚拟机之间不能ping通 3.虚拟机可以ping通主机(此时p ...
- NESTED LOOPS & HASH JOIN & SORT MERGE JOIN
表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...
- 多表连接的三种方式详解 hash join、merge join、 nested loop
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...
随机推荐
- 使用Android ADT最新开发工具后,新建项目出现appcompat v7 他是什么?
做Android开发的朋友最近会发现,更新ADT至22.6.0版本之后,创建新的安装项目,会出现appcompat_v7的内容.并且是创建一个新的内容就会出现.这到底是怎么回事呢?原来appcompa ...
- winfrom控件——基本工具
窗体事件:属性—事件—load(双击添加) 窗体加载完之后的事件: 删除事件:先将属性事件里挂号的事件名删掉(行为里的load)再删后台代码里的事件. 控件:工具箱里(搜索—双击或点击拖动到窗体界面) ...
- let,const,var三者之间的区别
在ES6中新增了两种定义变量的命令let和const,在这之前相信大家都对var定义变量很熟悉,那么在了解ES6方法前, 1.我们先来回顾一下var定义变量的方法. 下面来看这段代码: for (va ...
- 关于CI中的MVC以及扩展CI中的控制器
MVC是一种设计模式模式,M(模型)—V(视图)—C(控制器): MVC的核心思想是强制开发者在进行项目开发时,将数据的输入,处理,输出分开编写: 1.入口文件:该文件是唯一一个给浏览器直接请求的脚本 ...
- 全能VIP音乐在线解析
浏览器安装暴力猴扩展即可使用 // ==UserScript== // @name 全能VIP音乐在线解析 // @version 0.0.10 // @homepage https://greasy ...
- jQuery操作DOM知识总结
jquery操作DOM(节点) 1.创建元素 //$(htmlStr) //htmlStr:html格式的字符串 $("<span>这是一个span元素</span> ...
- <Android Framework 之路>Android5.1 MediaScanner
前言 MediaScanner是Android系统中针对媒体文件的扫描过程,将储存空间中的媒体文件通过扫描的方式遍历并存储在数据库中,然后通过MediaProvider提供接口使用,在Android多 ...
- OData + jqgrid 部署在IIS 8.0上可增加但不能删除修改问题
解决方法: <system.webServer>里添加 <modules> <remove name="WebDAVModule" /> < ...
- MySQL 5.6 Reference Manual-14.7 InnoDB Table Compression
14.7 InnoDB Table Compression 14.7.1 Overview of Table Compression 14.7.2 Enabling Compression for a ...
- dotnetnuke7.3.3 下弹出对话框(dnnConfirm())的使用
今天用dnn做一个列表里边有一个删除操作,就想做个对话框确定是否删除? 正常理解马上想到js的confirm("")函数,但是发现Dnn把这个函数给重写啦,弹出的对话框竟然是英文的 ...