关系型数据库工作原理-查询优化器之哈希连接(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. 然后按一桶一桶的方式比较内连接表和外连接表(将其中一个桶数据完成读到内存,另一个桶的数据逐条读取)。
发布了113 篇原创文章 · 获赞 183 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/ylforever/article/details/79838625