Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Начинучка
Guest
Всем привет!

В одной из сопровождаемых систем при разглядывании хранимых процедур и T-SQL-скриптов в джобах заметил интересную особенность: везде, где применяется while-цикл последним оператором, засунутым в тело цикла, является вызов WAITFOR DELAY '00:00:01'.
Подскажите - это личная инициатива разработчика данного кода или реальная насущная необходимость? Если насущная необходимость - то чем она вызвана?
Некоторые циклы гоняются по паре-тройке десятков тысяч раз за один вызов процедуры. И получается, что в процессе выполнения таких СП накапливается до часу холостых ожиданий...


З.Ы.
Я не Козлов и не Баранов. Я с MS SQL недавно, не судите строго... :)
30 сен 17, 15:27    [20833422]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Начинучка
Guest
Начинучка
Всем привет!

В одной из сопровождаемых систем при разглядывании хранимых процедур и T-SQL-скриптов в джобах заметил интересную особенность: везде, где применяется while-цикл, последним оператором, засунутым в тело цикла, является вызов WAITFOR DELAY '00:00:01'.
Подскажите - это личная инициатива разработчика данного кода или реальная насущная необходимость? Если насущная необходимость - то чем она вызвана?
Некоторые циклы гоняются по паре-тройке десятков тысяч раз за один вызов процедуры. И получается, что в процессе выполнения таких СП накапливается до часу холостых ожиданий...


З.Ы.
Я не Козлов и не Баранов. Я с MS SQL недавно, не судите строго... :)


Возможно, непонятно выразился... Хотел сказать следующее:
есть много хранимок, T-SQL-джобов.
в них часто используется цикл WHILE. В том числе и для реализации построчной обработки курсоров.
последним оператором в WHILE-цикле всегда является вызов WAITFOR DELAY '00:00:01'.

Вопрос: это так и надо или программист - параноик?
30 сен 17, 15:32    [20833428]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2775
можете убрать waitfor
в крайнем случае, поставить после завершения цикла while
30 сен 17, 16:01    [20833443]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35098
Мы таким подходом иногда пользуемся как элементом балансировки, к примеру, в "бесконечных" джобах, чтобы в холостую часто слишком не гонять, а то кушает таки процессор. А ставить такое в курсоре... разве что, чтобы потом быстро можно было увеличить скорость обработки в несколько раз, убрав эту строку.
30 сен 17, 16:36    [20833460]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Eleanor
Member

Откуда:
Сообщений: 1168
Начинучка,

Нашла в одной из своих систем - WAITFOR DELAY '00:00:02' везде, где идет отправка смс. Зачем, не знаю, возможно, какая-то особенность сервиса рассылки. Вдруг у вас что-то аналогичное.
30 сен 17, 18:56    [20833626]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Начинучка
Guest
Eleanor,

В моем случае чаще всего - либо чистка старых данных из таблиц, либо перенос данных из одной таблицы в другую. Везде сделано циклами через курсор, "пакетами" по 5-50 т. записей, и после каждой итерации цикла - завершающий WAITFOR...
30 сен 17, 19:23    [20833644]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Eleanor
Member

Откуда:
Сообщений: 1168
Начинучка,

Скорее всего разработчик думал, что обязательно нужно сделать waitfor между удалениями, чтобы другие запросы в эти интервалы имели возможность выполниться. Можно его удалить.
1 окт 17, 00:30    [20834014]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Eleanor
Member

Откуда:
Сообщений: 1168
И вот, где разработчик мог такие идеи почерпнуть:
deleting-1-millions-rows-in-sql-server
Комментарий про то, что WAITFOR не нужен, он уже не прочитал.
1 окт 17, 00:34    [20834019]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2775
Начинучка
Eleanor,

В моем случае чаще всего - либо чистка старых данных из таблиц, либо перенос данных из одной таблицы в другую. Везде сделано циклами через курсор, "пакетами" по 5-50 т. записей, и после каждой итерации цикла - завершающий WAITFOR...

Тогда можно использовать такой вариант:
while ...
  begin
  ...
  delete ...
  set @rowcount = @@rowcount;
  ...
  if @rowcount = 0 waitfor ...
  ...
 end;
1 окт 17, 06:34    [20834085]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1602
[quot Начинучка]
Начинучка
Всем привет!
в WHILE-цикле всегда является вызов WAITFOR DELAY '00:00:01'.

Вопрос: это так и надо или программист - параноик?


Может программист - весёлый любознательный, решил проверить обнаружат ли и когда
1 окт 17, 11:33    [20834239]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
iii2
Member

Откуда:
Сообщений: 189
Eleanor
Начинучка,

Скорее всего разработчик думал, что обязательно нужно сделать waitfor между удалениями, чтобы другие запросы в эти интервалы имели возможность выполниться. Можно его удалить.

У нас такие задержки разработчик вставил при удалении записей пакетами из большой "центральной" таблицы, которая связана с помощью декларативной ссылочной целостности on delete cascade c другими таблицами (не справочниками).
При том, что таблица при удалении записей блокируется with tablock.
Мотивировал именно такими соображениями - чтобы другие запросы, в т.ч. в другие таблицы - могли выполняться.
Проверено, без этого НЕ работает. Возникают дэдлоки, другие запросы висят дольше, чем хотелось бы и т.д.
Сервер 2008 (не R2)
2 окт 17, 15:04    [20836531]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
invm
Member

Откуда: Москва
Сообщений: 7504
iii2
При том, что таблица при удалении записей блокируется with tablock.
Мотивировал именно такими соображениями - чтобы другие запросы, в т.ч. в другие таблицы - могли выполняться.
Проверено, без этого НЕ работает. Возникают дэдлоки, другие запросы висят дольше, чем хотелось бы и т.д.
Ох уж эти сказочники...
Само собой, сказку сочинить гораздо легче, чем поработать головой...

А вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями.
2 окт 17, 15:15    [20836561]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
iii2
Member

Откуда:
Сообщений: 189
invm
iii2
При том, что таблица при удалении записей блокируется with tablock.
Мотивировал именно такими соображениями - чтобы другие запросы, в т.ч. в другие таблицы - могли выполняться.
Проверено, без этого НЕ работает. Возникают дэдлоки, другие запросы висят дольше, чем хотелось бы и т.д.
Ох уж эти сказочники...
Само собой, сказку сочинить гораздо легче, чем поработать головой...

А вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями.

Я подозреваю, что разработчик не разобрался с блокировками + каскадное удаление вносит свою лепту.
В принципе, нас не беспокоит, т.к. это сборщик мусора, который удаляет помеченные записи по окончании опердня.
Но факт остается фактом - без этого не работает.
Впрочем, это меньшее, за что разработчику хочется натянуть его трусы на голову.
2 окт 17, 15:50    [20836671]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
iii2
Member

Откуда:
Сообщений: 189
invm
А вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями.

Опять же подозреваю, что tablock был вставлен чтобы побороть дедлоки.
Это не моя система, не знаю всех подробностей.
2 окт 17, 15:54    [20836682]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Eleanor
Member

Откуда:
Сообщений: 1168
iii2,

У вас WAITFOR в одном месте, а у ТС это массово.
Скорее всего там и пробемы никакой не было, а разработчик думал, что так принято.

Кстати, вижу советы использовать WAITFOR и в приличных источниках:
1) Чистка таблицы в Dynamics CRM
/*If not calling from a SQL job, use the WAITFOR DELAY*/
if(@DeleteRowCount > @rowsAffected)
   return
else
   WAITFOR DELAY '00:00:02.000'
end


2) Gradually Deleting Data in SQL Server
- But I also don´t get the reason for the WAITFOR. Is it really necessary?
- The WAITFOR just gives the system a slight break in between deleting batches of rows. It helps have less effect on concurrency.
2 окт 17, 16:17    [20836779]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3857
я пишу WAITFOR DELAY в основном только в сервисных(разовых) скриптах, когда необходимо сделать массовую блочную операцию на объекте, из соображений освобождения ресурсов и уменшения конкуренции. Ну и кроме всего сервер делает массу операций кроме пользовательских, тот же сборщик удалённых записей, автообновление статистики...
2 окт 17, 16:36    [20836845]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
ziktuw
Member

Откуда:
Сообщений: 3547
Этот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.
5 окт 17, 16:15    [20845855]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35098
ziktuw
Этот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.
В MSSQL реализована невытесняющая многозадачность, и с управлением своими потоками в большинстве случаев он справляется сам, при этом квант выделяемого потокам времени равен 4мс, что меньше виндового. Так что версия не в кассу.
5 окт 17, 16:27    [20845894]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
dies irae
Member

Откуда:
Сообщений: 56
Гавриленко Сергей Алексеевич
ziktuw
Этот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.
В MSSQL реализована невытесняющая многозадачность, и с управлением своими потоками в большинстве случаев он справляется сам, при этом квант выделяемого потокам времени равен 4мс, что меньше виндового. Так что версия не в кассу.


а тут нет противоречия. если разработчик считает, что его поток не особо важен, он вполне может поставить waitfor, чтобы повысить скорость других потоков
5 окт 17, 17:28    [20846121]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35098
dies irae
а тут нет противоречия. если разработчик считает, что его поток не особо важен, он вполне может поставить waitfor, чтобы повысить скорость других потоков
Сначала делать cpu-consuming обработки на курсорах (лол), а потом балансировать это через waitfor (лол2)? Серьезно?
5 окт 17, 19:21    [20846354]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
dies irae
Member

Откуда:
Сообщений: 56
Гавриленко Сергей Алексеевич
dies irae
а тут нет противоречия. если разработчик считает, что его поток не особо важен, он вполне может поставить waitfor, чтобы повысить скорость других потоков
Сначала делать cpu-consuming обработки на курсорах (лол), а потом балансировать это через waitfor (лол2)? Серьезно?


вот иногда завидую людям, которые просто на ровном месте могут взять и посмеяться. Слегка неловко за них становится, ну да ладно
6 окт 17, 14:28    [20848435]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5263
При массовых загрузках/расчетах или индекс прибить на продакшне, а так - непонятно зачем.
6 окт 17, 14:32    [20848466]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35098
dies irae
Гавриленко Сергей Алексеевич
пропущено...
Сначала делать cpu-consuming обработки на курсорах (лол), а потом балансировать это через waitfor (лол2)? Серьезно?


вот иногда завидую людям, которые просто на ровном месте могут взять и посмеяться. Слегка неловко за них становится, ну да ладно
Вы просто не понимаете абсурдность описанной ситуации (если говорить про MSSQL).
6 окт 17, 15:14    [20848683]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
dies irae
Member

Откуда:
Сообщений: 56
Гавриленко Сергей Алексеевич
dies irae
пропущено...


вот иногда завидую людям, которые просто на ровном месте могут взять и посмеяться. Слегка неловко за них становится, ну да ладно
Вы просто не понимаете абсурдность описанной ситуации (если говорить про MSSQL).


Нет, это вы не понимаете. Поменьше высокомерия, шире кругозор, и не стоит делать выводов о ситуации не видя полной картины или хотя-бы одного куска кода.
давно замечаю, что этому форуму не хватает презумпции компетентности.
во всех начальных постах определённо делается вывод "КГ/АМ", хотя задачи бывают разные, базы разные, и подходы также могут встречаться абсолютно разные. Мир субд гораздо шире, чем вы себе представляете. И курсоры вполне имеют право на жизнь. Другое дело, что их часто лепят куда ни попадя, но в данном случае оснований для данного вывода НЕТ
6 окт 17, 16:29    [20848911]     Ответить | Цитировать Сообщить модератору
 Re: WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35098
dies irae
Гавриленко Сергей Алексеевич
пропущено...
Вы просто не понимаете абсурдность описанной ситуации (если говорить про MSSQL).


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

dies irae
и не стоит делать выводов о ситуации не видя полной картины или хотя-бы одного куска кода.
Здесь вы в 90% случаев никогда не увидите ситуацию полность. А иногда и кода тоже не увидите. А выводы делать надо.
6 окт 17, 16:33    [20848932]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить