繁体   English   中英

当日期范围较小时,SQL查询需要更长的时间?

[英]SQL query takes longer time when date range is smaller?

我有一个简单的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秒。

看到差异,我感到很惊讶。 我没想到差别如此之大。 相反,我期望它在较小的日期范围内花费相同或更少的时间。

可能是什么原因以及如何解决?

您最近是否插入和/或删除了大量行? 可能是表的索引上的统计信息已经过时,因此查询优化器将在较小的日期范围内进行“索引查找+键查找”方案 - 但结果却比仅仅执行表更慢/聚集索引扫描。

我建议更新统计信息(请参阅此TechNEt文章,了解如何更新统计信息并重试 - 任何改进?

查询优化器使用统计信息来确定是否更快地执行表扫描(只读取所有表的数据页并选择匹配的行),或者在索引中搜索搜索值是否更快; 该索引通常不包含所有数据 - 因此一旦找到匹配项,就需要在表上执行密钥查找以获取数据 - 这是一项昂贵的操作,因此它仅适用于小型数据集。 如果过时的统计信息“误导”了查询优化器,则可能会选择次优的执行计划

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM