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



哈希联接

MERGE JOIN

LOOP JOIN

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

#1 楼

在MSDN中,在“高级查询调整概念”主题中:


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


嵌套循环联接
/>合并联接
哈希联接

如果一个联接输入很小(少于10行),而另一个联接输入很大,并且在其联接列上建立了索引,则索引嵌套循环联接是最快的联接操作,因为它们需要最少的I / O和最少的比较。有关嵌套循环的更多信息,请参见了解嵌套循环连接。合并联接是最快的联接操作。如果两个联接输入都很大且两个输入的大小相似,则具有先后排序的合并联接和哈希联接的性能相似。但是,如果两个输入大小互不相同,则哈希联接操作通常会快得多。有关更多信息,请参见了解合并联接。

哈希联接可以有效地处理大型的,未排序的,未索引的输入。一个更基本的主题:查询调整,最后转到使用查询提示。

评论


同意,仅在万不得已时才使用加入提示(如果估算的数据与实际数据明显不同,有时很有用)。

–安德鲁·比克顿(Andrew Bickerton)
2011-1-27 14:49

#2 楼

本文对此进行了很好的解释:https://www.linkedin.com/pulse/loop-hash-merge-join-types-eitan-blumin

(假设N和M是其中的行数这两个表被联接)。

嵌套循环联接


复杂度:O(NlogM)
通常在一个表很小时使用/>较大的表具有允许使用连接键进行查找的索引

合并连接


复杂度:O(N + M)
两种输入都按联接键排序
使用了相等运算符
对于大型表非常出色

哈希联接


复杂度:如果忽略资源消耗成本,则为O(Nhc + Mhm + J)或O(N + M)
最后一种联接类型
使用哈希表和动态哈希匹配功能来匹配行
在内存消耗和磁盘I / O利用率方面更高的成本。