散列连接和合并连接(Oracle RDBMS)之间有什么区别?
在散列连接和合并连接之间性能增益/损失是什么,特别是在Oracle RDBMS中?
通过按照连接键对要连接的两个数据集进行sorting然后将它们合并在一起来执行“sorting合并”连接。 合并是非常便宜的,但sorting可能是非常昂贵,特别是如果sorting溢出到磁盘。 如果可以通过索引以sorting顺序访问其中一个数据集,则可以降低sorting的成本,但是与全表扫描相比,通过索引扫描访问高比例的块也是非常昂贵的。
散列连接是通过将一个数据集散列到基于连接列的内存中进行的,并读取另一个数据集并探测散列表中的匹配来执行的。 当散列表可以完全保存在内存中时,散列连接的成本非常低,总成本只比读取数据集的成本要高很多。 如果哈希表必须以单遍方式分散到磁盘上,那么成本就会上升,而对于多路分类,成本会大大增加。
通过对连接密钥上的两个表进行分区,可以减less散列连接的成本。 这允许优化器推断来自一个表中的分区的行将仅在另一个表的特定分区中find匹配,并且对于具有n个分区的表,散列连接被执行为n个独立的散列连接。 这具有以下效果:
- 每个散列表的大小都减小了,因此减less了所需的最大内存量,并且可能不需要操作来需要临时磁盘空间。
- 对于并行查询操作,大量减less进程间消息传递量,从而减lessCPU使用量并提高性能,因为每个散列连接可由一对PQ进程执行。
- 对于非并行查询操作,内存需求减less了n倍,并且先前从查询中投影出第一行。
您应该注意,散列连接只能用于equi连接,但合并连接更加灵活。
一般来说,如果你在一个equi-join中join大量的数据,那么散列连接将是一个更好的select。
文档中涵盖了这个主题。
http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523
我只是想编辑这个后代,当我回答这个问题时,oracle的标签没有被添加。 我的回应更适用于MS SQL。
合并连接是最好的,因为它利用了sorting,导致表单单向传递进行连接。 如果您有两个表(或覆盖索引),它们的sorting方式相同,例如主键和该键上的表的索引,则执行该操作时会导致合并连接。
哈希连接是次好的,因为它通常是在一个表有less量(相对)项时完成的,所以它有效地创build了一个临时表,每一行都有散列,然后连续search以创build连接。
最坏的情况是嵌套循环,它是order(n * m),这意味着没有sorting或大小可以利用,并且连接是简单的,对于表x中的每一行,search表y为连接做。