Nested Loop,Sort Merge Join,Hash Join
三种连接工作方式比较:
Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高。
Merge Join 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配,因为merge join需要做更多的排序,所以消耗的资源更多。 通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能。
Hash join的工作方式是将一个表(通常是小一点的那个表)做hash运算,将列数据存储到hash列表中,从另一个表中抽取记录,做hash运算,到hash列表中找到相应的值,做匹配。
NESTED LOOP 嵌套循环连接(一般用在连接的表中有索引,并且索引选择性较好的时候.)
1、块嵌套循环连接,就是把已经放在内存的两个关系块全部连接完成后再进行下一数据库块的比较,减少内存中数据块的IO;
2、索引嵌套循环连接,如果内层关系有索引,使用索引代替文件扫描,如果两个关系均有索引,一般把元组较少的关系作为外层关系时效果好。
嵌套循环连接的工作方式:
在嵌套循环连接中,Oracle从第一个行源中读取第一行,然后和第二个行源中的数据进行对比。所有匹配的记录放在结果集中,然后Oracle将读取第一个行源中的下一行。按这种方式直至第一个数据源中的所在行都经过处理。
在驱动行源表(就是您正在查找的记录)较小、或者内部行源表已连接的列有惟一的索引或高度可选的非惟一索引时, 嵌套循环连接效果是比较理想的。嵌套循环连接比其他连接方法有优势,它可以快速地从结果集中提取第一批记录,而不用等待整个结果集完全确定下来。
nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。 一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。 可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table1, table2)提示来强制使用nested loop。
select e.empno, e.ename, e.job, d.dname
from emp e, dept d
where e.deptno = d.deptno and e.empno = 7900;
解析:在这个查询中,优化器选择emp作为驱动表,根据唯一性索引PK_EMP快速返回符合条件empno为7900的记录,然后再与被驱动表dept的deptno关联查询相应的dname并最终返回结果集。由于dept表上面的deptno有唯一索引PK_DEPT,故查询能够快速地定位deptno对应dname为SALES的记录并返回。
嵌套循环连接驱动表的选择也是连接中需要着重注意的一点,有一个常见的误区是驱动表要选择小表,其实这是不对的。假如有两张表A、B关联查询,A表有1000000条记录,B表有10000条记录,但是A表过滤出来的记录只有10条,这时候显然用A表当做驱动表是比较合适的。因此驱动表是由过滤条件限制返回记录最少的那张表,而不是根据表的大小来选择的。
SORT MERGE JOIN排列合并连接(Sort Merge join 用在没有索引,并且数据已经排序的情况.)
在排列合并连接中,Oracle分别将第一个源表、第二个源表按它们各自要连接的列排序,然后将两个已经排序的源表合并。如果找到匹配的数据,就放到结果集中。
在缺乏数据的选择性或者可用的索引时,或者两个源表都过于庞大(超过记录数的5%)时,排序合并连接将比嵌套循环连更加高效。但是,排列合并连接只能用于等价连接(WHERE D.deptno=E.dejptno,而不是WHERE D.deptno>=E.deptno)。排列合并连接需要临时的内存块,以用于排序(如果SORT_AREA_SIZE设置得太小的话)。这将导致在临时表空间占用更多的内存和磁盘I/O。
sort merge join的操作通常分三步:
1、对连接的每个表做table access full;
2、对table access full的结果进行排序。
3、进行merge join对排序结果进行合并。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,merge join会比nested loops性能更佳。当表特别小或特别巨大的时候,实行全表访问可能会比索引范围扫描更有效。mrege join的性能开销几乎都在前两步。
HASH JOIN哈希连接 (Hash join在两个表的数据量差别很大的时候.)
当内存能够提供足够的空间时,哈希(HASH)连接是Oracle优化器通常的选择。散列连接是CBO做大数据集连接时的常用方式,优化器使用两个表中较小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。
只有在数据库初始化参数HASH_JOIN_ENABLED设为True,并且为参数PGA_AGGREGATE_TARGET设置了一个足够大的值的时候,Oracle才会使用哈希边连接。
这种方式适用于较小的表完全可以放于内存中的情况,这样总成本就是访问两个表的成本之和。但是在表很大的情况下并不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。也可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接。
转载于:https://www.cnblogs.com/toughhou/p/3778741.html
Nested Loop,Sort Merge Join,Hash Join相关推荐
- 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN
表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...
- 表的连接方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN【转】
表连接方式及使用场合 NESTED LOOP 对于被连接的数据子集较小的情况,nested loop连接是个较好的选择.nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查 ...
- oracle 非等值关联 优化,Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)...
查询优化器 Oracle的查询优化器(QO)分为两种: 1. RBO:Ruled-Based Optimization, 基于规则的优化器: 2. CBO :Cost-Based Optimizati ...
- oracle join 嵌套,誰能真正理解hash join/nested loop/merge join
关于这三种JOIN的理解.Nested loop join,Hash join,Sort merge join Nested loop join: 步骤:确定一个驱动表(outer table),另一 ...
- SQL优化(一) Merge Join vs. Hash Join vs. Nested Loop
本文介绍了Merge Join,Hash Join,Nested Loop这三种数据库Join方式的工作原理,并通过实验进一步说明了其适用范围. 原创文章,转载请务必将下面这段话置于文章开头处(保留超 ...
- 循序渐进丨MogDB Hash join实现
点击蓝字 关注我们 Join有三种实现算法:Nested Loop.Merge Join.Hash join.他们各有优缺点: Nested Loop通常性能不好,但适用于任何类型的join: Mer ...
- 深入理解Oracle表(5):三大表连接方式详解之Hash Join的定义,原理,算法,成本,模式和位图
Hash Join只能用于相等连接,且只能在CBO优化器模式下.相对于nested loop join,hash join更适合处理大型结果集 Hash Join的执行计划第1个是has ...
- Mysql 优化器内部JOIN算法hash join Nestloopjoin及classic hash join CHJ过程详解
Mysql hash join之classic hash join CHJ过程详解 hash join的历史 优化器里的hash join算法在SQL Server.Oracle.postgress等 ...
- hive分桶表join_Hive:JOIN及JOIN优化 2015.10.25
1. Join的基本原理 大家都知道,Hive会将所有的SQL查询转化为Map/Reduce作业运行于Hadoop集群之上.在这里简要介绍Hive将Join转化为Map/Reduce的基本原理(其它查 ...
最新文章
- 美国AI就业市场全景:开放职位512个,基本工资最高26万美元
- 爱奇艺发布2018年Q2财报:总营收62亿元同比大增51%,会员收入达25亿元
- 关于GiF动图你不知道的9件事
- Linux查看修改时间、时区
- Python字符串| 带示例的format()方法
- 2020 年程序员高考试卷来了!
- hadoop 操作(二)
- Windows7安装java
- 苹果笔记本摄像头linux驱动下载,更适配Windows:苹果MacBook摄像头驱动更新
- 开发Windows物流管理系统——(二)代码实现
- 计算机拒绝访问移动硬盘,移动硬盘无法访问拒绝访问,教你移动硬盘无法访问拒绝访问怎么办...
- 股票成交量和价格关系
- ue4生成粒子发射器
- 那些诡异的黑客事件 一
- 【盲解调】基于频率和滤波器参数估计的FH-GFSK调制信号盲解调算法matlab仿真
- 详解爬电距离和电气间隙
- 统计图表导入word,用到echarts,highcharts,amcharts,jfreechart
- python开发语音录入_基于python实现语音录入识别代码实例
- 谷胱甘肽(GSH)修饰的CdTe/CdS量子点(GSH-CdTe/CdSQDs)|PEG修饰水溶性量子点ZnS:Mn
- METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(六)
热门文章
- Android获取当前位置的三种方式及其使用方法
- 打开php.ini中的Safe_mode,会影响哪些函数?
- 构造、拷贝构造、赋值、析构
- session实现验证码功能
- 优秀项目经理必备的8个要素
- MOCTF-Web-暴跳老板*
- commonjs是什么_JavaScript模块化标准CommonJS/AMD/CMD/UMD/ES6Module的区别
- JS:两个json数组合并、去重,以及删除某一项元素
- vue .prettierrc文件常见配置, 以及配置 Prettier - Code formatter 插件 格式化
- (十二)运行环境(加载、性能优化、安全)【这些会了,你就可以飞了】