ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Nested loop join和 Sort merge join

2021-12-21 01:31:06  阅读:194  来源: 互联网

标签:Sort join 索引 t2 t1 merge hash loop


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

  关系数据库技术的精髓就是通过关系表进行规范化的数据存储,并通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理。

表的三种关联方式:

nested loop:从A表抽一条记录,遍历B表查找匹配记录,然后从a表抽下一条,遍历B表........就是一个二重循环 hash join:将A表按连接键计算出一个hash表,然后从B表一条条抽取记录,计算hash值,根据hash到A表的hash来匹配符合条件的记录 sort merge join:将A,B表都排好序,然后做merge,符合条件的选出

  对于三种连接,我们都可以使用hint来强制让优化器走:use_hash,use_nl,use_merge.

Nested Loop Join

1.执行原理

复制代码
例如:
select t1.*,t2.* from t1,t2 where t1.col1=t2.col2;
访问机制如下:
for i in (select * from t1) loop  ----t1为驱动表
 for j in (select * from t2 where col2=i.col1) loop
 display results;
 end loop;
 end loop;
类似一个嵌套循环
嵌套循环执行时,先是外层循环进入内层循环,并在内层循环终止之后
接着执行外层循环再由外层循环进入内层循环中,当外层循环全部终止时,程序结束
复制代码

2.步骤如下

a.确定驱动表
b.把inner 表分配给驱动表
c.针对驱动表的每一行,访问被驱动表的所有行

3.执行计划大致如下

复制代码
NESTED LOOPS
outer_loop  --驱动表
inner_loop

优化器模式为FIRST_ROWS时,我们经常会发现有大量的NESTED LOOP
这时,在返回数据给用户时,我们没有必要缓存任何数据,这是nested loop的一大亮点
复制代码

4.使用场景

 一般用在连接的表中有索引,并且索引选择性较好(也就是Selectivity接近1)的时候
  也就是驱动表的记录集比较小(<10000)而且inner表需要有有效的访问方法(Index)
  需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的

5.和索引的关系

复制代码
 嵌套循环和索引就像一对孪生兄弟,一般需要共同考量与设计,这从优化器的执行机制可以看出.
  比如,存在2张表,一个10条记录,一个1000万条记录
  以小表为驱动表,则代价为:10*(通过索引在大表查询一条记录的代价)
  如果1000万的大表没有索引的时候,那么COST的代价可想而知
  因此,在多表连接时,注意被驱动表的连接字段是否需要创建索引
  或者连接字段与该表的其他约束条件字段上是否需要创建复合索引
复制代码

Sort Merge Join

 1.执行原理

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,依次交替 比对 归并,但无所谓驱动

2.使用场景

复制代码
虽说,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大概就用在没有索引,并且数据已经排序的情况
复制代码

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30180323/viewspace-2145612/,如需转载,请注明出处,否则将追究法律责任。

标签:Sort,join,索引,t2,t1,merge,hash,loop
来源: https://www.cnblogs.com/andyok/p/15713623.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有