Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста? / 25 сообщений из 53, страница 1 из 3
30.09.2017, 15:27
    #39528836
Начинучка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Всем привет!

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


З.Ы.
Я не Козлов и не Баранов. Я с MS SQL недавно, не судите строго... :)
...
Рейтинг: 0 / 0
30.09.2017, 15:32
    #39528838
Начинучка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
НачинучкаВсем привет!

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


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

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

Вопрос: это так и надо или программист - параноик?
...
Рейтинг: 0 / 0
30.09.2017, 16:01
    #39528845
Prolog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
можете убрать waitfor
в крайнем случае, поставить после завершения цикла while
...
Рейтинг: 0 / 0
30.09.2017, 16:36
    #39528853
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Мы таким подходом иногда пользуемся как элементом балансировки, к примеру, в "бесконечных" джобах, чтобы в холостую часто слишком не гонять, а то кушает таки процессор. А ставить такое в курсоре... разве что, чтобы потом быстро можно было увеличить скорость обработки в несколько раз, убрав эту строку.
...
Рейтинг: 0 / 0
30.09.2017, 18:56
    #39528876
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Начинучка,

Нашла в одной из своих систем - WAITFOR DELAY '00:00:02' везде, где идет отправка смс. Зачем, не знаю, возможно, какая-то особенность сервиса рассылки. Вдруг у вас что-то аналогичное.
...
Рейтинг: 0 / 0
30.09.2017, 19:23
    #39528878
Начинучка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Eleanor,

В моем случае чаще всего - либо чистка старых данных из таблиц, либо перенос данных из одной таблицы в другую. Везде сделано циклами через курсор, "пакетами" по 5-50 т. записей, и после каждой итерации цикла - завершающий WAITFOR...
...
Рейтинг: 0 / 0
01.10.2017, 00:30
    #39528917
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Начинучка,

Скорее всего разработчик думал, что обязательно нужно сделать waitfor между удалениями, чтобы другие запросы в эти интервалы имели возможность выполниться. Можно его удалить.
...
Рейтинг: 0 / 0
01.10.2017, 00:34
    #39528918
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
И вот, где разработчик мог такие идеи почерпнуть:
deleting-1-millions-rows-in-sql-server
Комментарий про то, что WAITFOR не нужен, он уже не прочитал.
...
Рейтинг: 0 / 0
01.10.2017, 06:34
    #39528929
Prolog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
НачинучкаEleanor,

В моем случае чаще всего - либо чистка старых данных из таблиц, либо перенос данных из одной таблицы в другую. Везде сделано циклами через курсор, "пакетами" по 5-50 т. записей, и после каждой итерации цикла - завершающий WAITFOR...
Тогда можно использовать такой вариант:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
while ...
  begin
  ...
  delete ...
  set @rowcount = @@rowcount;
  ...
  if @rowcount = 0 waitfor ...
  ...
 end;
...
Рейтинг: 0 / 0
01.10.2017, 11:33
    #39528962
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
[quot Начинучка]НачинучкаВсем привет!
в WHILE-цикле всегда является вызов WAITFOR DELAY '00:00:01'.

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

Может программист - весёлый любознательный, решил проверить обнаружат ли и когда
...
Рейтинг: 0 / 0
02.10.2017, 15:04
    #39529431
iii2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
EleanorНачинучка,

Скорее всего разработчик думал, что обязательно нужно сделать waitfor между удалениями, чтобы другие запросы в эти интервалы имели возможность выполниться. Можно его удалить.
У нас такие задержки разработчик вставил при удалении записей пакетами из большой "центральной" таблицы, которая связана с помощью декларативной ссылочной целостности on delete cascade c другими таблицами (не справочниками).
При том, что таблица при удалении записей блокируется with tablock.
Мотивировал именно такими соображениями - чтобы другие запросы, в т.ч. в другие таблицы - могли выполняться.
Проверено, без этого НЕ работает. Возникают дэдлоки, другие запросы висят дольше, чем хотелось бы и т.д.
Сервер 2008 (не R2)
...
Рейтинг: 0 / 0
02.10.2017, 15:15
    #39529439
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
iii2При том, что таблица при удалении записей блокируется with tablock.
Мотивировал именно такими соображениями - чтобы другие запросы, в т.ч. в другие таблицы - могли выполняться.
Проверено, без этого НЕ работает. Возникают дэдлоки, другие запросы висят дольше, чем хотелось бы и т.д.Ох уж эти сказочники...
Само собой, сказку сочинить гораздо легче, чем поработать головой...

А вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями.
...
Рейтинг: 0 / 0
02.10.2017, 15:50
    #39529485
iii2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
invmiii2При том, что таблица при удалении записей блокируется with tablock.
Мотивировал именно такими соображениями - чтобы другие запросы, в т.ч. в другие таблицы - могли выполняться.
Проверено, без этого НЕ работает. Возникают дэдлоки, другие запросы висят дольше, чем хотелось бы и т.д.Ох уж эти сказочники...
Само собой, сказку сочинить гораздо легче, чем поработать головой...

А вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями.
Я подозреваю, что разработчик не разобрался с блокировками + каскадное удаление вносит свою лепту.
В принципе, нас не беспокоит, т.к. это сборщик мусора, который удаляет помеченные записи по окончании опердня.
Но факт остается фактом - без этого не работает.
Впрочем, это меньшее, за что разработчику хочется натянуть его трусы на голову.
...
Рейтинг: 0 / 0
02.10.2017, 15:54
    #39529492
iii2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
invmА вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями.
Опять же подозреваю, что tablock был вставлен чтобы побороть дедлоки.
Это не моя система, не знаю всех подробностей.
...
Рейтинг: 0 / 0
02.10.2017, 16:17
    #39529515
Eleanor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
iii2,

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

Кстати, вижу советы использовать WAITFOR и в приличных источниках:
1) Чистка таблицы в Dynamics CRM
Код: sql
1.
2.
3.
4.
5.
6.
/*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.
...
Рейтинг: 0 / 0
02.10.2017, 16:36
    #39529529
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
я пишу WAITFOR DELAY в основном только в сервисных(разовых) скриптах, когда необходимо сделать массовую блочную операцию на объекте, из соображений освобождения ресурсов и уменшения конкуренции. Ну и кроме всего сервер делает массу операций кроме пользовательских, тот же сборщик удалённых записей, автообновление статистики...
...
Рейтинг: 0 / 0
05.10.2017, 16:15
    #39531604
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Этот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.
...
Рейтинг: 0 / 0
05.10.2017, 16:27
    #39531619
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
ziktuwЭтот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.В MSSQL реализована невытесняющая многозадачность, и с управлением своими потоками в большинстве случаев он справляется сам, при этом квант выделяемого потокам времени равен 4мс, что меньше виндового. Так что версия не в кассу.
...
Рейтинг: 0 / 0
05.10.2017, 17:28
    #39531713
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Гавриленко Сергей АлексеевичziktuwЭтот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.В MSSQL реализована невытесняющая многозадачность, и с управлением своими потоками в большинстве случаев он справляется сам, при этом квант выделяемого потокам времени равен 4мс, что меньше виндового. Так что версия не в кассу.

а тут нет противоречия. если разработчик считает, что его поток не особо важен, он вполне может поставить waitfor, чтобы повысить скорость других потоков
...
Рейтинг: 0 / 0
05.10.2017, 19:21
    #39531777
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
dies iraeа тут нет противоречия. если разработчик считает, что его поток не особо важен, он вполне может поставить waitfor, чтобы повысить скорость других потоковСначала делать cpu-consuming обработки на курсорах (лол), а потом балансировать это через waitfor (лол2)? Серьезно?
...
Рейтинг: 0 / 0
06.10.2017, 14:28
    #39532255
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Гавриленко Сергей Алексеевичdies iraeа тут нет противоречия. если разработчик считает, что его поток не особо важен, он вполне может поставить waitfor, чтобы повысить скорость других потоковСначала делать cpu-consuming обработки на курсорах (лол), а потом балансировать это через waitfor (лол2)? Серьезно?

вот иногда завидую людям, которые просто на ровном месте могут взять и посмеяться. Слегка неловко за них становится, ну да ладно
...
Рейтинг: 0 / 0
06.10.2017, 14:32
    #39532262
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
При массовых загрузках/расчетах или индекс прибить на продакшне, а так - непонятно зачем.
...
Рейтинг: 0 / 0
06.10.2017, 15:14
    #39532306
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
dies iraeГавриленко Сергей Алексеевичпропущено...
Сначала делать cpu-consuming обработки на курсорах (лол), а потом балансировать это через waitfor (лол2)? Серьезно?

вот иногда завидую людям, которые просто на ровном месте могут взять и посмеяться. Слегка неловко за них становится, ну да ладноВы просто не понимаете абсурдность описанной ситуации (если говорить про MSSQL).
...
Рейтинг: 0 / 0
06.10.2017, 16:29
    #39532371
dies irae
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
Гавриленко Сергей Алексеевичdies iraeпропущено...


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

Нет, это вы не понимаете. Поменьше высокомерия, шире кругозор, и не стоит делать выводов о ситуации не видя полной картины или хотя-бы одного куска кода.
давно замечаю, что этому форуму не хватает презумпции компетентности.
во всех начальных постах определённо делается вывод "КГ/АМ", хотя задачи бывают разные, базы разные, и подходы также могут встречаться абсолютно разные. Мир субд гораздо шире, чем вы себе представляете. И курсоры вполне имеют право на жизнь. Другое дело, что их часто лепят куда ни попадя, но в данном случае оснований для данного вывода НЕТ
...
Рейтинг: 0 / 0
06.10.2017, 16:33
    #39532376
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
dies iraeГавриленко Сергей Алексеевичпропущено...
Вы просто не понимаете абсурдность описанной ситуации (если говорить про MSSQL).

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

dies iraeи не стоит делать выводов о ситуации не видя полной картины или хотя-бы одного куска кода.Здесь вы в 90% случаев никогда не увидите ситуацию полность. А иногда и кода тоже не увидите. А выводы делать надо.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста? / 25 сообщений из 53, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]