一尘不染

哈希联接和合并联接(Oracle RDBMS)有什么区别?

sql

哈希联接和合并联接之间的性能收益/损失是什么(特别是在Oracle RDBMS中)?


阅读 157

收藏
2021-03-17

共1个答案

一尘不染

通过根据联接键对要联接的两个数据集进行排序,然后将它们合并在一起,可以执行“排序合并”联接。合并非常便宜,但是排序可能会非常昂贵,尤其是当排序溢出到磁盘时。如果可以通过索引以排序的顺序访问其中一个数据集,则可以降低排序的成本,尽管与全表扫描相比,通过索引扫描访问表中较高比例的块也很昂贵。

哈希联接是通过基于联接列将一个数据集哈希到内存中并读取另一个数据集并探测哈希表中的匹配项来执行的。当哈希表可以完全保存在内存中时,哈希联接的成本非常低,总成本仅比读取数据集的成本高。如果必须将哈希表以单遍排序的方式散布到磁盘上,则成本会增加,而对于多遍排序的成本则会大大增加。

(在10g之前的版本中,从大表到小表的外部联接在性能上是有问题的,因为优化器无法解决需要首先访问较小的表进行哈希联接的问题,而不能访问较大的表首先进行外部联接的问题。因此,在这种情况下,哈希联接不可用)。

可以通过对联接键上的两个表进行分区来降低哈希联接的成本。这使优化器可以推断出一个表中某个分区的行只会在另一表的特定分区中找到匹配项,对于具有n个分区的表,哈希联接将作为n个独立的哈希联接执行。这具有以下效果:

  1. 每个哈希表的大小都减小了,因此减少了所需的最大内存量,并有可能消除了需要临时磁盘空间的操作的需求。
  2. 对于并行查询操作,由于每个哈希联接可以由一对PQ进程执行,因此大大减少了进程间消息传递的数量,从而减少了CPU使用率并提高了性能。
  3. 对于非并行查询操作,内存需求减少了n倍,并且从查询中更早地投影了第一行。

您应该注意,哈希联接只能用于等联接,但是合并联接更为灵活。

通常,如果您要通过等值联接来联接大量数据,那么哈希联接将是更好的选择。

文档中很好地涵盖了该主题。

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

12.1文档:https//docs.oracle.com/database/121/TGSQL/tgsql_join.htm

2021-03-17