【发布时间】:2015-08-14 17:45:13
【问题描述】:
需要帮助了解此 SQL Server 行为
我有一个相当基本的查询,比如
select x, y, sum(z)
from table
where date between @start and @end
group by x, y
存在大量行(过滤条件从总共 1600 万行中检索到 600 万行)
我不明白的是:这个查询很慢,我收到一个关于溢出到 tempdb 的警告。但是,如果我更改它并直接将@start 和@end 替换为相同的日期,它会快得多,并且不会出现有关 tempdb 溢出的警告。
我的猜测是 tempdb 溢出是因为基数估计。
看来,当我使用变量时,统计数据很差。它估计大约 145 万行而不是 600 万行。
当我使用文字时,估计值几乎完全正确。
在使用变量时如何获得正确的估计值并避免 tempdb 溢出?
【问题讨论】:
-
您的统计数据是最新的吗?
-
我认为统计数据可以基于使用文字看到正确的估计。问题似乎是我的变量值没有用于估计。
-
如果你这样做
where date >= @start and date <= @end会发生什么? -
之间与不等式运算符的行为相同
标签: sql sql-server