проблема производительности SQL - PullRequest
3 голосов
/ 16 мая 2011

У меня есть база данных с 24M записями в SQL Server 2000.

Когда я запускаю этот запрос

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

он работает очень быстро и возвращает 3500 записей в первые 10 секунд, обратите внимание, что starttime равно char(30) в базе данных

Но когда я запускаю этот запрос, он просто возвращает 32 записи за 10 ~ 60 секунд

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 проиндексирован в моей базе данных

Я хочу знать, в чем моя проблема?

Ответы [ 2 ]

0 голосов
/ 16 мая 2011

Та же проблема, что и здесь и здесь .Используйте OPTION (RECOMPILE)

0 голосов
/ 16 мая 2011

Sql-сервер, вероятно, имеет кешированный план запроса для запроса с двумя параметрами, что не является оптимальным для значений параметров. В sqlserver 2008 вы можете использовать Оптимизацию для неизвестных подсказок. http://blogs.msdn.com/b/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx В SQL Server 2000 вы можете попробовать одну из других опций, упомянутых в статье.

...