【发布时间】:2010-11-09 20:21:54
【问题描述】:
哈希联接和合并联接之间的性能增益/损失是什么,特别是在 Oracle RDBMS 中?
【问题讨论】:
标签: sql performance oracle join
哈希联接和合并联接之间的性能增益/损失是什么,特别是在 Oracle RDBMS 中?
【问题讨论】:
标签: sql performance oracle join
“排序合并”连接是通过根据连接键对要连接的两个数据集进行排序,然后将它们合并在一起来执行的。合并非常便宜,但排序可能非常昂贵,特别是如果排序溢出到磁盘。如果可以通过索引按排序顺序访问其中一个数据集,则可以降低排序的成本,尽管与全表扫描相比,通过索引扫描访问表的大部分块也可能非常昂贵.
哈希连接是通过根据连接列将一个数据集散列到内存中并读取另一个数据集并探测哈希表中的匹配项来执行的。当哈希表可以完全保存在内存中时,哈希连接的成本非常低,总成本仅比读取数据集的成本多一点。如果哈希表必须在一次排序中溢出到磁盘,则成本会增加,而对于多次排序,成本会大大增加。
(在 10g 之前的版本中,从大表到小表的外连接在性能方面存在问题,因为优化器无法解决首先访问较小表以进行散列连接的需要,但需要先访问较大表以进行散列连接外连接。因此在这种情况下哈希连接不可用)。
可以通过在连接键上对两个表进行分区来降低哈希连接的成本。这允许优化器推断来自一个表中一个分区的行只会在另一个表的特定分区中找到匹配项,并且对于具有 n 个分区的表,哈希连接作为 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
【讨论】:
我只是想为后代编辑这个,因为我回答这个问题时没有添加 oracle 的标签。我的回答更适用于 MS SQL。
Merge join 是最好的,因为它利用了排序,导致单次向下传递表来执行连接。如果您有两个排序相同的表(或覆盖索引),例如主键和该键上表的索引,那么如果您执行该操作,则会产生合并连接。
哈希连接是次优的,因为它通常在一个表具有少量(相对)项目时完成,它有效地创建一个临时表,其中包含每一行的哈希值,然后连续搜索以创建连接。
最坏的情况是嵌套循环,它是 order (n * m),这意味着没有可利用的顺序或大小,连接很简单,对于表 x 中的每一行,搜索表 y 以进行连接。
【讨论】: