0

速记

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

  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
4

1 回答 1

1

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

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

INNER HASH JOIN
于 2010-06-16T14:15:59.230 回答