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
但是如果我将变量更改为常量 - 那就没问题了。
像这样:
where
dtn.DocTaskNote_ID between 0 and 1000
另外,如果我删除连接,一切都可以。
不知道问题出在哪里
最佳答案
如果您的查询位于存储过程中,则您提到的问题的一个可能原因是参数嗅探。 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)
这样,每次使用当前参数值执行过程时都会编译查询。
进一步阅读:
关于sql - 使用变量时 SELECT 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41614592/