3

我在 SQL Server 2000 中有一个包含 24M 条记录的数据库。

当我运行这个查询

select * from cdr
where starttime between '2011-05-15 00:00:00.000' and '2011-05-16 00:00:00.000'

甚至这个

declare @MinDate char(30) ,@MaxDate char(30)
set @MinDate=substring(convert(char,(getdate()-1), 120),1,10)+' 00:00:00.000'
set @MaxDate=substring(convert(char,(getdate()), 120),1,10)+' 00:00:00.000'
select * from cdr
where starttime between '2011-05-15 00:00:00.000' and @MaxDate

它运行速度非常快,并在 10 秒内返回 3500 条记录,请注意starttimechar(30)数据库中

但是当我运行这个查询时,它只会在 10~60 秒内返回 32 条记录

declare @MinDate char(30), @MaxDate char(30)

set @MinDate = substring(convert(varchar, (getdate()-1), 120),1,10)+' 00:00:00.000'
set @MaxDate = substring(convert(varchar, (getdate()), 120),1,10)+' 00:00:00.000'

select * from cdr

where starttime between @MinDate and @MaxDate

:: @MinDate 值为 2011-05-15 00:00:00.000

请注意,starttime在我的数据库中编制了索引

我想知道我的问题是什么?

4

2 回答 2

0

与此处此处相同的问题。利用OPTION (RECOMPILE)

于 2011-05-16T14:59:42.837 回答
0

Sql server 可能为带有 2 个参数的查询缓存了一个查询计划,这对于您的参数值不是最佳的。在 sqlserver 2008 中,您可以使用 Optimize for unknown 提示。http://blogs.msdn.com/b/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx 在 SQL server 2000 中你可以试试文章中提到的其他选项之一。

于 2011-05-16T09:45:52.547 回答