这是现实生活问题的简化版本。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)。
所以问题是:为什么一个变量会产生更好的计划,即使根据我的经验它应该更糟?
编辑:统计数据是最新且正确的