Oracle数据库中hash join和nested loop怎么用

88次阅读
没有评论

共计 1932 个字符,预计需要花费 5 分钟才能阅读完成。

这篇文章主要为大家展示了“Oracle 数据库中 hash join 和 nested loop 怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“Oracle 数据库中 hash join 和 nested loop 怎么用”这篇文章吧。

Oracle 表的连接方式 —–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 大概就用在没有索引,并且数据已经排序的情况 

以上是“Oracle 数据库中 hash join 和 nested loop 怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-18发表,共计1932字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)