【问题标题】:SQL Server Hash Joins versus Nested LoopsSQL Server 哈希联接与嵌套循环
【发布时间】:2011-03-04 09:15:28
【问题描述】:

速记

所以,当我在下面写问题时,我找到了一种自己解决问题的方法。我想我还是会发布这个问题,因为:

  1. 可能有人会觉得它很有用。
  2. 我不太明白它为什么起作用。

无论如何都是固定代码(见答案)。


我最初写道:

我花了很长时间在谷歌上搜索,可以找到很多相关的答案,但没有一个与我的问题完全匹配。

我针对 SQL Server (10) 数据库运行下面的代码,它的执行速度非常快。 它使用的执行计划涉及哈希连接。

然后我再次运行它,但这次取消注释前两行(DECLARE 和 SET 行),同时删除 y.[in date] 旁边的 '+1' 并取消注释 '+ @COUNTER'。 现在查询需要很长时间才能完成 - 执行计划而不是使用嵌套循环。请注意,我仍然只是在日期上加一,但使用的是变量而不是常量。

问题是:我可以使用@COUNTER 使用哈希联接而不是嵌套循环进行查询吗?

( 一点背景: 我正在尝试做的是松散匹配 x.[in date] 和 y.[in date] 以便它们在彼此之间的指定天数内匹配。查询要使用的天数是从另一个表中的字段填充的。我首先尝试将 datediff() 与 abs() 和小于一起使用,但我很确定这将始终使用嵌套循环。 (无论如何,当我尝试它时它会这样做!)

我尝试做各种参数嗅探文章中提到的所有事情,但它们并没有改变任何事情。无论如何,我没有将其作为存储过程运行。我猜这与 [in date] 字段上的索引有关。 )

-- DECLARE @COUNTER INT
-- SET @COUNTER = 1

BEGIN

    SELECT
        x.[line id]
        , y.[line id]

    FROM
        lines1 AS x
        JOIN lines2 AS y ON (

            x.[in date] = y.[in date] + 1 -- + @COUNTER
            AND x.[country] = y.[country]

        )

    WHERE
        x.[country] = 'USA'

END

【问题讨论】:

  • 您可以回答自己的问题。最好将最后一部分移到答案中。

标签: sql-server join-hints


【解决方案1】:

问题是:我可以使用@COUNTER 使用哈希联接而不是嵌套循环进行查询吗?

是的。您可以使用连接提示来强制执行此操作:

INNER HASH JOIN

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2016-11-15
    相关资源
    最近更新 更多