关系型数据库工作原理-查询优化器之哈希连接(13)

本文翻译自Coding-Geek文章:《 How does a relational database work》。原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies

本文翻译了如下章节, 介绍数据库查询优化器的哈希连接的实现原理:
这里写图片描述

哈希连接-Hash join

哈希连接算法更复杂,但在大多数情况下性能也比循环嵌套连接更优。

这里写图片描述

哈希连接的基本思路是:

  1. 获取内连接表的所有元素。
  2. 在内存中构件一张哈希表。
  3. 逐条获取外连接表中数据。
  4. 计算外连接表每条数据的哈希值,用前面哈希表的哈希函数。通过哈希值找到关联内连接表的桶。
  5. 判断桶中是否存在元素与外连接表中的数据匹配。

为分析时间复杂度,我需要做一些假设以简化这个问题:

  1. 内连接表被划分为X个哈希桶。
  2. 哈希函数计算的哈希值是均匀分布的,也就是说产生的哈希桶大小是相同的。
  3. 匹配外连接表中的元素与桶中的元素所有元素,所需要的开销是桶中元素的数量(译者注:即桶中所有的元素都会参与比较一次)。

这个算法的时间复杂度是(M/X) * N + cost_to_create_hash_table(M) + cost_of_hash_function*N

如果哈希算法创建的桶足够小(译者注:极限情况是一个元素一个桶),那么时间复杂度可以到O(M+N)。

还有另外一种哈希连接的实现方式,它使用更少的内存,但需要更多的磁盘I/O:

  1. 同时对内连接表和外连接表计算哈希表。
  2. 然后将哈希表放到磁盘上存储。
  3. 然后按一桶一桶的方式比较内连接表和外连接表(将其中一个桶数据完成读到内存,另一个桶的数据逐条读取)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值