我有一个简单的select语句,它从SQL Server 2000(旧的)表中选择数据,大约有1000万到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秒。
我很惊讶地看到了差异。我没想到差别如此之大。相反,我期望它在较小的日期范围内花费相同或更少的时间。
这可能是什么原因以及如何解决?
答案 0 :(得分:4)
您最近是否插入和/或删除了大量行?可能是表格索引的统计数据已经过时,因此查询优化器将进行索引查找+键查找&#34;在较小的日期范围内的情况 - 但结果比仅进行表/聚集索引扫描要慢。
我建议更新统计信息(请参阅此TechNEt article on how to update the statistics)并重试 - 有任何改进吗?
查询优化器使用统计信息来确定执行表扫描是否更快(只需读取所有表的数据页并选择匹配的行),或者是否为更快地搜索索引中的搜索值;该索引通常不包含所有数据 - 因此一旦找到匹配项,就需要在表上执行密钥查找以获取数据 - 这是一项昂贵的操作,因此它只是可行的对于小数据集。如果过时的统计数据&#34;误导&#34;查询优化器,它可能会选择次优的执行计划