2008-09-17 3 views
5

Учитывая, что хранимая процедура на SQL Server 2005, которая проходит через курсор, должна запускаться один раз в час, и для ее выполнения требуется около 5 минут, но она занимает большой кусок процессорного времени:Команда WAITFOR

Редактировать: Я бы удалил курсор, если мог, к несчастью, я должен выполнять кучу обработки и запускать другие сохраненные procs/queries на основе строки.

Могу ли я использовать WAITFOR DELAY '0: 0: 0.1' перед каждой выборкой, чтобы действовать как версия SQL .Net's Thread.Sleep? Таким образом, чтобы другие процессы быстрее выполнялись за счет времени выполнения этой процедуры.

Или есть другое решение, которое я не вижу?

Спасибо

ответ

4

Поставив WAITFOR внутри цикла будет действительно замедлить его и позволить другие вещи, чтобы идти быстрее. Вы можете также рассмотреть цикл WHILE вместо курсора - по моему опыту он работает быстрее. Вы также можете подумать о том, чтобы переместить курсор на ускоренный курсор, предназначенный только для чтения, который может ограничить объем памяти, который он занимает.

declare @minid int, @maxid int, @somevalue int 
select @minid = 1, @maxid = 5 
while @minid <= @maxid 
begin 
    set @somevalue = null 
    select @somevalue = somefield from sometable where id = @minid 
    print @somevalue 
    set @minid = @minid + 1 
    waitfor delay '00:00:00.1' 
end 
1

Я не уверен, что это решит проблему. IMHO проблема производительности с курсорами связана с объемом памяти, которую вы используете, чтобы сохранить резидентный массив данных и прокручивать его, если вы затем добавите waitfor внутри цикла, вы задерживаете ресурсы дольше.

Но, возможно, я ошибаюсь, я бы предложил использовать perfmon для проверки производительности сервера в обоих условиях, а затем принять решение о том, стоит или нет добавить ожидание.

Глядя на тег, я предполагаю, что вы используете MS SQL Server, а не какие-либо другие вкусы.

0

Вы можете отложить процедуру, но это может вам помочь или не помочь. Это зависит от того, как работает эта процедура. Является ли это транзакцией, почему курсор (ужасно неэффективен в SQL Server), где происходит замедление и т. Д. Возможно, переработка процедуры будет иметь больше смысла.

0

С тех пор, как SQL 2005 включал функции окон и другие опрятные функции, я смог устранить курсоры почти во всех случаях. Возможно, ваша проблема лучше всего будет устранена путем устранения самого курсора?

Определенно проверить функции ранжирования http://msdn.microsoft.com/en-us/library/ms189798.aspx и Агрегатные функции окна http://msdn.microsoft.com/en-us/library/ms189461.aspx

0

Я предполагаю, что любой имеющийся у вас код означает, что другие процессы не могут получить доступ к таблице, из которой получен ваш курсор.

При условии, что вы сделаете курсор READONLY FASTWORD, вы не должны блокировать таблицы, из которых получен курсор.

Если вам нужно написать, тогда WAITFOR не поможет. Как только вы заблокируете стол, он заблокирован.

Опция заключается в том, чтобы сфотографировать таблицы в таблицу temp, а затем вместо этого курсор/петлю. Затем вы не будете блокировать базовые таблицы, но в равной мере таблицы могут измениться при обработке моментального снимка ...

Dems