我有一个简单的 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 文章 http://technet.microsoft.com/en-us/library/aa260645%28v=sql.80%29.aspx)然后再试一次 - 有什么改进吗?
查询优化器使用统计信息来确定是否只进行表扫描(只需读取表的所有数据页并选择匹配的行)更快,或者在索引中搜索搜索值是否更快;该索引通常不包含所有数据 - 因此一旦找到匹配项,就需要在表上执行键查找以获取数据 - 这是一项昂贵的操作,因此它仅适用于小数据集。如果过时的统计信息“误导”查询优化器,它可能会选择次优的执行计划
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)