左散列连接总是比左外连接更好吗?

mer*_*ger 7 sql-server hashing

我有一个运行速度很慢的查询(见下文)。同时寻找改善它的方式,我们发现,约十倍,如果我们更换了更快的查询运行LEFT OUTER JOINLEFT JOIN HASH

结果似乎是一样的。是吗?在什么情况下它不会返回相同的结果?有什么区别?在运行 LEFT HASH JOIN 而不是 LEFT OUTER JOIN 时,有什么我应该注意的吗?

查询中的[ABC].[ExternalTable]表是我添加为外部表的另一台服务器上的视图

SELECT t.foo, t.bar, t.data
FROM [dbo].[Table] as t
LEFT OUTER JOIN [ABC].[ExternalTable] as s ON s.foo = t.foo and s.bar = t.bar and s.data = t.data
WHERE s.foo is null and s.bar IS NULL and s.data IS NULL
Run Code Online (Sandbox Code Playgroud)

Han*_*non 11

在语义上,两个查询是相同的。在LOOP相对于HASH简单地告诉SQL Server使用哪个选项返回结果。如果您在没有LOOP或的情况下运行查询HASH,SQL Server 可能会选择这些选项中的任何一个,具体取决于它认为性能最佳的选项。根据设计,这两个选项返回相同的结果。换句话说1,关键字HASHLOOP在这种情况下是所谓的连接提示,它是 Transact-SQL 中三种提示之一。更让您困惑的是,您还可以将连接提示指定为查询提示,尽管两种情况下的效果不一定相同。请注意,提供这些类型的连接提示意味着FORCE ORDER提示,它指定在查询优化期间保留查询语法指示的连接顺序(有关更多详细信息,请参阅下面的 Paul 回答)。

SQL Server 使用查询中每个表的统计信息,以明智地选择对JOINT-SQL 查询语句中的每个表进行哪种物理操作。

在这种情况下,由于[ExternalTable]是通过链接服务器引用的视图,SQL Server 可能期望表中有 1 行 - 即它不知道期望有多少行。

您可以向查询添加连接提示以强制合并连接,也可以简单地将行复制[ExternalTable]到具有聚集索引的本地 #temp 表中,然后针对该表运行查询。

散列连接的完整语法是:

LEFT OUTER HASH JOIN [ABC].[ExternalTable] s ON s.foot = t.foo .....
Run Code Online (Sandbox Code Playgroud)

HASH在 join 语句中带有 的版本允许 SQL Server 选择连接类型,在您的特定情况下,它最有可能选择 LOOP 连接,您可以强制使用:

LEFT OUTER LOOP JOIN [ABC].[ExternalTable] s ON s.foot = t.foo .....
Run Code Online (Sandbox Code Playgroud)

我通常不建议指定连接类型,因为大多数时候 SQL Server 非常有能力选择最合适的连接运算符样式。


1 - 感谢 Andriy 在这里的措辞。


Tib*_*szi 8

我只想在此处的其他答案和评论中添加一些内容:

您正在将苹果与橙子进行比较。

OUTER 是逻辑连接运算符。它指定您要保留行的一侧。因此需要说 LEFT 或 RIGHT。可以省略 OUTER 这个词,意思是 LEFT JOIN 和说 LEFT OUTER JOIN 是一样的。

HASH 是 SQL Server 的指令,指定如何执行您要求的任何连接(例如左连接)。我们一般避免使用提示,让优化器决定如何去做。优化器反过来依赖于诸如统计之类的东西来尝试提出执行您所要求的最佳方式。覆盖优化器的一个缺点是优化器在事情发生变化时进行调整的自由度较小,例如其中一个表中有更多数据,或者您添加或删除了索引。

因此,说 LEFT HASH JOIN 与说 LEFT OUTER HASH JOIN 非常相似。外字是可选的。


Pau*_*ite 5

LEFT HASH JOIN运行 a而不是 a时有什么需要注意的吗LEFT OUTER JOIN

是的。使用连接提示(如LEFT HASH JOIN强制查询中指定的表的连接顺序)。它强制优化器按文本顺序连接表,就像您也添加了一样OPTION (FORCE ORDER)

使用连接提示具有相同的效果FORCE ORDER,包括禁用聚合的重新定位以及引入部分聚合。

使用连接提示时要格外小心。它们对查询优化器的限制比大多数人意识到的要多得多。