Команда официантов - PullRequest
       7

Команда официантов

5 голосов
/ 17 сентября 2008

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

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

Могу ли я использовать ЗАДЕРЖКА ОЖИДАНИЯ '0: 0: 0.1' перед каждой выборкой выступать в качестве версии SQL .Net Thread.Sleep? Это позволяет другим процессам завершаться быстрее за счет времени выполнения этой процедуры.

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

Спасибо

Ответы [ 5 ]

4 голосов
/ 17 сентября 2008

Помещение 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 голос
/ 17 сентября 2008

Я не уверен, что это решит проблему. ИМХО проблема с курсорами связана с объемом памяти, который вы используете, чтобы сохранить резидентный набор данных и проходить по нему, если затем вы добавляете waitfor внутри цикла, вы дольше используете ресурсы.

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

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

0 голосов
/ 17 января 2009

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

При условии, что вы делаете курсор ЧИТАЕМОЕ FASTWORD, вы не должны блокировать таблицы, из которых получен курсор.

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

Можно было бы сделать снимок таблицы во временную таблицу, а затем вместо этого навести курсор / цикл. Тогда вы не будете блокировать базовые таблицы, но в равной степени таблицы могут измениться во время обработки снимка ...

Демс

0 голосов
/ 17 сентября 2008

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

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

0 голосов
/ 17 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...