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

Ste*_*eam 4 sql sql-server sql-server-2000

我有一个简单的 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) 
Run Code Online (Sandbox Code Playgroud)

这在大约 10 秒内给了我大约 40 K 行。但是,如果我设置@startDate = '2014-01-30',始终保持@endDate 相同,那么查询大约需要 2 分 30 秒

为了产生相同数量的行,我再次尝试使用 01-30 并花费了 2 分 48 秒。

我很惊讶地看到差异。没想到差别这么大。相反,我希望在较小的日期范围内花费相同或更短的时间。

这可能是什么原因,我该如何解决?

mar*_*c_s 7

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

我会建议更新统计数据(请参阅这篇关于如何更新统计数据的 TechNEt 文章)并重试 - 有任何改进吗?

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