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
另外,如果我删除了联接,一切都可以。
无法找出问题所在
答案 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)
这样,每次使用当前参数值执行过程时,都会编译查询。
进一步阅读: