所以,当我写下面的问题时,我找到了一种方法来解决它。我以为我还会发布这个问题,因为:
无论如何固定代码(见答案)。
我花了很多年时间搜索这个并且可以找到很多相关的答案,但没有一个完全符合我的问题。
我在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
答案 0 :(得分:1)
问题是:我可以使用@COUNTER使用散列连接而不是嵌套循环来进行查询吗?
是。您可以使用联接提示来强制执行此操作:
INNER HASH JOIN