3

SQLServer2000に2400万レコードのデータベースがあります。

このクエリを実行すると

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-1500:00:00.000です

starttime私のデータベースで索引付けされていることに注意してください

私の問題は何ですか?

4

2 に答える 2

0

Sql サーバーには、パラメーター値に最適ではない 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 サーバー 2000 で試すことができます記事に記載されている他のオプションの 1 つ。

于 2011-05-16T09:45:52.547 に答える
0

hereおよびhereと同じ問題。使用するOPTION (RECOMPILE)

于 2011-05-16T14:59:42.837 に答える