【老贝伏枥】 hash join、merge join、 nested loop

浏览: 2315

多表联合查询的时候,如果查看执行计划就会发现里面有多表之间的连接方式:hash join、merge join、 nested loop

具体适用哪种类型的连接取决于

  • 当前的优化器模式 (ALL_ROWS 和 RULE)
  • 取决于表大小
  • 取决于连接列是否有索引
  • 取决于连接列是否排序

1、hash join

  场景:在两个表的数据量差别很大的时候,如

  select city_name,country_name from country,city where country.country_id=city.country_id

图片.png

  优化器使用两个表中较小的表利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描较大的表,同样对JOIN KEY进行HASH后探测散列表,找出与散列表匹配的行。

2、merge join

  场景:

  • 1.RBO(基于规则的优化器)模式
  • 2.不等价关联(>,<,>=,<=,<>)
  • 3.HASH_JOIN_ENABLED=false
  • 4. 没有索引且数据已经排序

select city_name,country_name from country,city where country.country_id < city.country_id

图片.png

 先将关联表的关联列各自排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。因为merge join需要做更多的排序,所以消耗的资源更多。

3、nest looop

  场景:

  •   驱动表的记录集比较小(<10000)而且inner表具备有效的访问方法,且索引选择性较好
  •   驱动表的记录集一定要小,返回结果集的响应时间最快

  如

  select city_name,country_name from country,city where country.country_id<>city.country_id

图片.png 

  循环从一张表中读取数据(驱动表outer table),然后访问另一张表(被查找表 inner table,有索引)。驱动表中的每一行与inner表中的相应记录JOIN,类似一个嵌套的循环。

推荐 0
本文由 贝克汉姆 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册