日期范围越小SQL查询时间越长?

标签 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) 

这在大约 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/

相关文章:

sql插入到带有选择案例值的表中

sql-server - 为什么 SQL Server 认为临时表已经存在,而实际上它并不存在?

stored-procedures - 在SQL Server 2000中删除存储过程的语法是什么?

asp.net - 使用 LINQtoSQL 的日期时间超出范围问题

sql - 与一个表合并为一个表的双重关系

sql - 测试 SQL Server 中的空格

sql-server - 从现有表创建新表,无需复制身份属性

c# - 将图像上传到新数据库而不是使用应用程序的数据库

sql - 查找一个月内的不同记录

sql - 使用数据定义语言删除列和所有依赖对象