我有一个简单的 select 语句,它从 SQL Server 2000(这么旧)的表中选择数据,该表大约有 10-2000 万行,如下所示 -
@startDate = '2014-01-25' -- yyyy-mm-dd
@endDate = '2014-02-20'
SELECT
Id, 6-7 other columns
FROM
Table1 as t1
LEFT OUTER JOIN
Table2 as t2 ON t1.Code = t2.Code
WHERE
t1.Id = 'G59' -- yes, its a varchar
AND (t1.Entry_Date >= @startDate AND t1.Entry_Date < @endDate)
这在大约 10 秒内为我提供了大约 40 K 行。但是,如果我设置 @startDate = '2014-01-30',并始终保持 @endDate 相同,那么查询大约需要 2 分 30 秒
为了产生相同数量的行,我再次尝试使用 01-30,花了 2 分 48 秒。
我很惊讶地发现了这种差异。我没想到差别会这么大。相反,我希望在较小的日期范围内花费相同或更少的时间。
这可能是什么原因以及如何解决?
最佳答案
您最近是否插入和/或删除了大量行?可能是表索引上的统计信息已过时,因此查询优化器将在较小的日期范围内采用“索引查找+键查找”方案 - 但这比仅执行表要慢/聚集索引扫描。
我建议更新统计信息(请参阅此 TechNEt article on how to update the statistics )并重试 - 有任何改进吗?
查询优化器使用统计信息来确定是否只进行表扫描(只需读取表的所有数据页并选择匹配的行)更快,或者是否在索引中搜索搜索值更快;该索引通常不包含所有数据 - 因此一旦找到匹配项,就需要在表上执行键查找以获取数据 - 这是一项昂贵的操作,因此它仅适用于小数据集。如果过时的统计信息“误导”查询优化器,它可能会选择次优的执行计划
关于日期范围越小SQL查询时间越长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21873491/