小编Vla*_*sak的帖子

在子选择中,使用 GetDate 而不是 @variable 会导致更糟糕的执行计划

执行计划

这是现实生活问题的简化版本。GetDate在子选择中使用时,计划更糟且不同。2个查询:

select * , (select count(1) 
            from hamsfa.customer as sub 
            where sub.tstamp_nosync > @old 
              and sub.cus_id > main.cus_id) as x 
from hamsfa.customer as main ;


select * , (select count(1) 
            from hamsfa.customer as sub 
            where sub.tstamp_nosync > dateadd(year, -100, getdate())
              and sub.cus_id > main.cus_id) as x 
from hamsfa.customer as main ;
Run Code Online (Sandbox Code Playgroud)

我不完全理解的是为什么。

变量应该按我的理解变差。

还有另一个查询,这导致了几乎 700% 的差异(1s 与 7s)。

所以问题是:为什么一个变量会产生更好的计划,即使根据我的经验它应该更糟?

编辑:统计数据是最新且正确的

sql-server execution-plan

3
推荐指数
1
解决办法
386
查看次数

标签 统计

execution-plan ×1

sql-server ×1