【发布时间】:2011-03-04 09:15:28
【问题描述】:
速记
所以,当我在下面写问题时,我找到了一种自己解决问题的方法。我想我还是会发布这个问题,因为:
- 可能有人会觉得它很有用。
- 我不太明白它为什么起作用。
无论如何都是固定代码(见答案)。
我最初写道:
我花了很长时间在谷歌上搜索,可以找到很多相关的答案,但没有一个与我的问题完全匹配。
我针对 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