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

网友投稿 324 2023-12-07

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

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

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

2.步骤如下

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

3.执行计划大致如下

NESTED LOOPS outer_loop  --驱动表 inner_loop 优化器模式为FIRST_ROWS时,我们经常会发现有大量的NESTED LOOP 这时,在返回数据给用户时,我们没有必要缓存任何数据,这是nestedloop的一大亮点

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 byt1_1.id,这里的id代表连接字段 访问t2,并orderby t2_1.id join t1_1.id = t2_1.id,依次交替 比对 归并,但无所谓驱动

2.使用场景

虽说,hash join就是用来替代sj的,但如果你的服务器的CPU资源和MEM资源都很紧张的时候,建议用SORTMERGE JOIN 因为hash joinsort merge join需要的资源更多。特别是cpu 10sql tuning 文档上写道: Onthe other hand,sort-merge joins can perform better than hash joins if both of the following conditions aremet: Therow sources are already sorted.  A sort operation does not have tobe done. 所以,sj大概就用在没有索引,并且数据已经排序的情况

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:数据库中如何操作大数据集
下一篇:数据库中如何实现PROFILE
相关文章

 发表评论

暂时没有评论,来抢沙发吧~