使用变量时SELECT挂起

时间:2017-01-12 13:34:04

标签: sql select sql-server-2014

SQL Server 2014(v13.0.4001.0) - 此示例脚本挂起:

DECLARE @from int = 0
DECLARE @to int = 1000

select  
    *
from 
    TaskNote dtn 
join 
    Participants tp on dtn.Task_ID = tp.TaskId
where 
    dtn.TaskNote_ID between @from and @to

但如果我将变量更改为常量 - 一切都OK。

像这样:

where 
    dtn.DocTaskNote_ID between 0 and 1000

另外,如果我删除了联接,一切都可以。

无法找出问题所在

1 个答案:

答案 0 :(得分:1)

如果您的查询位于存储过程中,您提到的问题的可能原因是参数嗅探。 SQL Server首次使用参数的初始值编译查询。在后续的过程调用中,引擎使用缓存的执行计划,这可能不是当前变量值的最佳值。

解决此问题的一个方法是使用OPTION (RECOMPILE)

select *
from TaskNote dtn 
join Participants tp on dtn.Task_ID = tp.TaskId
where dtn.TaskNote_ID between @from and @to
option (recompile)

这样,每次使用当前参数值执行过程时,都会编译查询。

进一步阅读: