需要帮助来了解此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溢出?
tempdb 溢出是由于估计而导致的,而估计是不正确的,因为我使用的是局部变量。
如果我将局部变量更改为参数化 SQL sp_executesql,估计结果就会正确,并且 tempdb 溢出就会消失。
然而,即使解决了 tempdb 溢出问题,参数化 SQL仍然比使用文字慢,我为该单独的问题创建了一个新问题。
SQL Server 2014 性能 - 参数化 SQL 与文字
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |