操作员使用tempdb溢出...。使用变量但不使用文字

wrs*_*der 5 sql sql-server

需要帮助来了解此SQL Server行为

我有一个相当基本的查询

select x, y, sum(z) 
from table 
where date between @start and @end
group by x, y
Run Code Online (Sandbox Code Playgroud)

行数众多(过滤条件从1600万行中检索了600万行)

我不明白的是:此查询速度很慢,并且我收到有关溢出到tempdb的警告。但是,如果我改变它,只需更换@start@end直接与同一日期,它的速度更快,而且也没有关于tempdb中溢出的警告。

我的猜测是,tempdb溢出是由于基数估计。

看来,当我使用变量时,统计信息远非如此。它估计大约有145万行而不是600万行。

当我使用文字时,估计值几乎完全正确。

使用变量时,如何获得正确的估计值并避免tempdb溢出?

wrs*_*der 0

tempdb 溢出是由于估计而导致的,而估计是不正确的,因为我使用的是局部变量。

如果我将局部变量更改为参数化 SQL sp_executesql,估计结果就会正确,并且 tempdb 溢出就会消失。

然而,即使解决了 tempdb 溢出问题,参数化 SQL仍然比使用文字慢,我为该单独的问题创建了一个新问题。

SQL Server 2014 性能 - 参数化 SQL 与文字