SQL Server“修复”哈希匹配查询而不是嵌套循环

W v*_*Rij 3 performance sql-server query-performance

目前我有一个运行非常缓慢的视图。执行大约需要 3 分钟。这突然发生了。

为了调试发生了什么,我使用了一个旧数据集并比较了两个查询。在旧数据集上,视图会在一秒钟内返回数据。

我注意到一个区别:当前数据集在“嵌套循环”上运行,而我的旧数据集使用哈希匹配运行。

你可以在图片中看到:

示例数据集 1(当前)与 2(旧)

我知道你不能像我在其他主题中看到的那样“强制”它使用哈希匹配,但我很难找出为什么它会使用嵌套循环。

这是因为我的数据集中的某些内容不是唯一的吗?

如何修复我当前的数据集以再次开始使用此哈希匹配?

wBo*_*Bob 6

如果您打算这样做,您至少应该改用OPTION ( HASH JOIN )语法。使用LEFT HASH JOIN语法隐式地强制执行连接顺序。

这对于散列连接来说是不可取的,因为通常您希望被连接的两个表中较小的一个是构建输入,即执行计划中最顶层的表。使用选项语法允许优化器在运行时决定最佳连接顺序。如需进一步阅读,请参阅这两篇文章:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

https://msdn.microsoft.com/en-GB/library/ms173815.aspx