关系型数据库工作原理-查询优化器之最优的连接算法(15)

版权声明:本文为博主原创文章,转载需注明原文链接及作者。 https://blog.csdn.net/ylforever/article/details/79872008

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

本文翻译了如下章节, 介绍数据库查询优化器的如何选择最优的连接算法:

这里写图片描述

哪一种算法最优-Which one is the best?

假如存在一个最优算法的话,那就不会有其它的算法存在了。这个问题非常难以回答,因为有太多因素需要考虑,辟如:

  1. 空闲内存数量:缺少足够的内存就没有办法使用强大的哈希连接算法(至少无法使用完整内存哈希连接。译者注:前面描述的哈希连接的第一种实现)。

  2. 参与连接的两个数据集(表)的大小。例如,如果你将一张大表与一张小表做连接,循环嵌套算法就比哈希连接算法快很多,因为创建哈希表的成本很高;如果将两张很大的表用循环嵌套算法做连接,则非常耗CPU资源。

  3. 存在索引的情况。如果已经建立了B+树索引,使用哈希连接算法是最好的选择。

  4. 如果查询结果需要排序:即使你正在处理一个的是一个未经排序的工作集(表),你也可能需要用代价昂贵的哈希连接,因为最终结果也可能会做排序。而且你可以用这个查询结果继续与其表做哈希连接(或者也有可能查询结果本手就要求做排序处理,查询语句中使用了ORDER BY/GROUP BY/DISTINCT等)。

  5. 如果处理的关系表已经排好序。在这种情况下,哈希连接是最好的候选方案。

  6. 受你正在处理的连接方式影响:是否采用的相等比较连接(例如: tableA.col1 = tableB.col2?) 是否是内连接或者外连接,或者是一个笛卡尔集全连接,或者自身跟自身做连接。部分连接方式不能使用某些连接算法。

  7. 数据的分布情况。如果用于连接的条件是不唯一的(例如,将一个人口信息表用人的名做关联,但是很多人是同名的),使用哈希连接算法是很糟糕的,因为哈希函数将产生一个性能很差的哈希桶结构。

  8. 你是否需要采用多线程或者多进程的方式来执行连接运算

更多的信息,你可以阅读DB2, ORACLE or SQL Server的官方指导文档。

猜你喜欢

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