SQL Server哈希联接与嵌套循环

时间:2010-06-16 09:34:29

标签: sql-server join-hints


快速记录

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

  1. 有人可能觉得它很有用。
  2. 我不太了解为什么会有效。
  3. 无论如何固定代码(见答案)。


    我原来写道:

    我花了很多年时间搜索这个并且可以找到很多相关的答案,但没有一个完全符合我的问题。

    我在SQL Server(10)数据库上运行下面的代码并且执行速度非常快。 它使用的执行计划涉及散列连接。

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

    问题是:我可以使用@COUNTER使用散列连接而不是嵌套循环来进行查询吗?

    (有点背景: 我正在尝试做的是松散地匹配x。[在日期]和y。[在日期],以便它们匹配,如果它们在彼此的指定天数内。要使用的查询天数是从另一个表中的字段填充的。我尝试首先使用datediff()和abs()并且少于,但我很确定这将始终使用嵌套循环。 (无论如何我都会这样做!)

    我尝试了各种参数嗅探文章中提到的所有内容,但它们没有改变。无论如何,我没有将它作为存储过程运行。我猜这与[在日期]字段中的索引有关。 )

    -- 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
    

1 个答案:

答案 0 :(得分:1)

问题是:我可以使用@COUNTER使用散列连接而不是嵌套循环来进行查询吗?

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

INNER HASH JOIN