哈希、合并和循环连接之间的区别?

And*_*ton 45 sql-server

在 SQL Server 中,您可以指定连接提示:

  • HASH JOIN
  • MERGE JOIN
  • LOOP JOIN

这三个连接提示的定义是什么,应该什么时候使用?

Mar*_*ian 44

来自 MSDN,在Advanced Query Tuning Concepts的主题中:

SQL Server 使用三种类型的连接操作:

  • 嵌套循环连接

  • 合并连接

  • 哈希连接

如果一个连接输入很小(少于 10 行)而另一个连接输入相当大并且在其连接列上建立索引,则索引嵌套循环连接是最快的连接操作,因为它们需要最少的 I/O 和最少的比较。有关嵌套循环的更多信息,请参阅了解嵌套循环联接。

如果两个连接输入不小但在它们的连接列上排序(例如,如果它们是通过扫描排序索引获得的),则合并连接是最快的连接操作。如果两个连接输入都很大并且两个输入的大小相似,则使用先验排序的合并连接和散列连接提供相似的性能。但是,如果两个输入大小彼此显着不同,则散列连接操作通常要快得多。有关更多信息,请参阅了解合并联接。

散列连接可以有效地处理大型、未排序、未索引的输入。

但我相信您应该从一个更基本的主题开始:查询调优,最后使用查询提示。

  • 同意,加入连接提示应该只作为最后的手段(如果估计数据与实际数据显着不同,有时很有用)。 (5认同)

Mar*_*ari 7

这篇文章解释得很好:https ://www.linkedin.com/pulse/loop-hash-merge-join-types-eitan-blumin

(假设NM是正在连接的两个表中的行数)。

嵌套循环连接

  • 复杂度:O(NlogM)
  • 通常在一张表非常小时使用
  • 较大的表有一个索引,允许使用连接键查找它

合并连接

  • 复杂度:O(N+M)
  • 两个输入都按连接键排序
  • 使用相等运算符
  • 非常适合非常大的桌子

哈希连接

  • 复杂度:如果忽略资源消耗成本,则为O(N hc+M hm+J) 或 O(N+M)
  • 最后手段加入类型
  • 使用哈希表和动态哈希匹配函数来匹配行
  • 内存消耗和磁盘 I/O 利用率方面的成本较高。