powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
53 сообщений из 53, показаны все 3 страниц
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39528836
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

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


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

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


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

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

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

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

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

Скорее всего разработчик думал, что обязательно нужно сделать waitfor между удалениями, чтобы другие запросы в эти интервалы имели возможность выполниться. Можно его удалить.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39528918
Eleanor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот, где разработчик мог такие идеи почерпнуть:
deleting-1-millions-rows-in-sql-server
Комментарий про то, что WAITFOR не нужен, он уже не прочитал.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39528929
Prolog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка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
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39528962
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Начинучка]НачинучкаВсем привет!
в WHILE-цикле всегда является вызов WAITFOR DELAY '00:00:01'.

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

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

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

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

А вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями.
Я подозреваю, что разработчик не разобрался с блокировками + каскадное удаление вносит свою лепту.
В принципе, нас не беспокоит, т.к. это сборщик мусора, который удаляет помеченные записи по окончании опердня.
Но факт остается фактом - без этого не работает.
Впрочем, это меньшее, за что разработчику хочется натянуть его трусы на голову.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39529492
iii2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invmА вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями.
Опять же подозреваю, что tablock был вставлен чтобы побороть дедлоки.
Это не моя система, не знаю всех подробностей.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39529515
Eleanor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39529529
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я пишу WAITFOR DELAY в основном только в сервисных(разовых) скриптах, когда необходимо сделать массовую блочную операцию на объекте, из соображений освобождения ресурсов и уменшения конкуренции. Ну и кроме всего сервер делает массу операций кроме пользовательских, тот же сборщик удалённых записей, автообновление статистики...
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39531604
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39531619
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziktuwЭтот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.В MSSQL реализована невытесняющая многозадачность, и с управлением своими потоками в большинстве случаев он справляется сам, при этом квант выделяемого потокам времени равен 4мс, что меньше виндового. Так что версия не в кассу.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39531713
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичziktuwЭтот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime).
Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать.В MSSQL реализована невытесняющая многозадачность, и с управлением своими потоками в большинстве случаев он справляется сам, при этом квант выделяемого потокам времени равен 4мс, что меньше виндового. Так что версия не в кассу.

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

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

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


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

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

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

dies iraeи не стоит делать выводов о ситуации не видя полной картины или хотя-бы одного куска кода.Здесь вы в 90% случаев никогда не увидите ситуацию полность. А иногда и кода тоже не увидите. А выводы делать надо.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39532400
dies irae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей АлексеевичЗдесь вы в 90% случаев никогда не увидите ситуацию полность. А иногда и кода тоже не увидите. А выводы делать надо.

не надо. достаточно просто ответить на вопрос и не придумывать лишнего.
т.е. по умолчанию считать автора (или других разработчиков, как в данном посте) компетентным, пока не доказано обратное.
Таким простым принципом можно достичь хоть какого-то подобия дружелюбия сообщества
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39532408
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dies iraeГавриленко Сергей АлексеевичЗдесь вы в 90% случаев никогда не увидите ситуацию полность. А иногда и кода тоже не увидите. А выводы делать надо.

не надо. достаточно просто ответить на вопрос и не придумывать лишнего.
т.е. по умолчанию считать автора (или других разработчиков, как в данном посте) компетентным, пока не доказано обратное.
Таким простым принципом можно достичь хоть какого-то подобия дружелюбия сообщества
пуська, ты чего? все по дефолту записаны в бригаду Козловых
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39532427
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dies iraeне надо. достаточно просто ответить на вопрос и не придумывать лишнего.
т.е. по умолчанию считать автора (или других разработчиков, как в данном посте) компетентным, пока не доказано обратное.
Таким простым принципом можно достичь хоть какого-то подобия дружелюбия сообществаОтвечайте как вам угодно. А когда навязываете свое видение мира окружающим, будьте готовы, что им это может не понравится.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39532428
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Для всех: этот раздел предназначен для обсуждения MSSQL, а не форума, так что дальнейшее развитие этой темы здесь я сочту за оффтпик и удалю.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39532476
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziktuwНу и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой . Другим параллельным запросам легче проработать.

Репро можете предоставить где показан описанный Вами "лайфхак"?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969549
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возобновлю тему.

Вопрос скорее по внутреннему устройству SQL Server: Если запускаю хранимую процедуру, в которой в курсоре выполняется запрос на linked-сервере , то вставка waitfor delay в конце каждой итерации цикла влияет как-то на выполнение или нет? Блокировки есть, но они накладываются и снимаются внутри каждого выполняемого на linked-сервере запроса.

Интересует вопрос в разрезе транзакций, блокировок таблиц и т.п.

У меня складывается впечатление, что MS SQL engine понимает наличие waitfor delay (ещё при построении плана?) и каким-то образом меняет своё поведение. В плане распределённых транзакций, блокировок, (?).

PS К вопросу об waitfor delay при отправке SMS и при сходных ситуациях: у меня был случай когда в курсоре запускалась xp_cmdshell и на маленьких циклах (1 - 3 итеррации) всё было благополучно. Время отработки единичной итерации - менее 1 секунды (вызов простенькой программы на C# с параметрами; программа формировала и отправляла на сервис JSON, кидала служебную инфу в базу) . Когда курсор выполнялся по 10-20-....-50 раз, то MS Windows Server впадал в ступор. Процедура выполнялась до часу (!). Вставка waitfor delay '00:00:03' решила проблему. Так проект работает полностью автоматически уже год (ну, чуть больше). Это автоматическая обработка заказов с одного из маркетплейсов. Меньшее время задержки waitfor delay (1 или 2 сек.) лишь частично снимало проблему, идеально было 6 секунд ожидания, но 50раз*6секунд было многовато, - опытным путём подобрано примерно 4 сек. на цикл: задержка на 3 секунды в конце каждой итерации + 1 секунда ещё на что-то = итого 4 сек.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969552
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Waitfor delay '00:00:03' -- это известное в узких кругах заклинание, его надо вставлять везде, чтобы работало быстрее. Особенно в циклах. Желательно, в очень вложенных циклах.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969554
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
Waitfor delay '00:00:03' -- это известное в узких кругах заклинание, его надо вставлять везде, чтобы работало быстрее. Особенно в циклах. Желательно, в очень вложенных циклах.

И?
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969586
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_,

Если вы откроете транзакцию и запустите waitfor, то очевидно, что блокировки зависнуть и съеденные ресурсы будут висеть занятыми.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969587
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
ремя отработки единичной итерации - менее 1 секунды

Имеется в виду получение кода возврата от ОС или реальное завершение всех потоков вызванного процесса и освобождение всех ресурсов?
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969589
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мой знакомый как-то удивился, увидев в индусском SQL-коде удаление в цикле построчно. Не помню, был там сабж или нет.
Я ему объяснил, что так, по мнению автора, снижается блокировка важной таблицы. :)

Примерно то же самое и в сабже: для снижения нагрузки и блокировок.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969632
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
У меня складывается впечатление, что MS SQL engine понимает наличие waitfor delay (ещё при построении плана?) и каким-то образом меняет своё поведение. В плане распределённых транзакций, блокировок, (?).
Нет, это просто пауза.

SIMPLicity_
Процедура выполнялась до часу (!). Вставка waitfor delay '00:00:03' решила проблему.
Такое может быть, но не из за изменения поведения сервера, а из за того, что уменьшается накапливание коннектов, ожидающих конца блокировок, и блокирующих друг друга.

Т.е. это проблема системы, в которой при увеличении нагрузки резко падает нагрузочная способность.
Вставка паузы - простое и быстрое решение проблемы, но при увеличении нагрузки мешать будут уже другие процессы, так что лучше попытаться разобраться именно с этой проблемой.
a_voronin
Если вы откроете транзакцию и запустите waitfor, то очевидно, что блокировки зависнуть и съеденные ресурсы будут висеть занятыми.
Явно пауза стоит вне транзакции, иначе бы она не помогала.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969649
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot alexeyvg#22151418]
SIMPLicity_

a_voronin
Если вы откроете транзакцию и запустите waitfor, то очевидно, что блокировки зависнуть и съеденные ресурсы будут висеть занятыми.
Явно пауза стоит вне транзакции, иначе бы она не помогала.


Что значит "вне транзакции"?

То есть если сделать в одной транзакции

Код: sql
1.
2.
3.
4.
5.
6.
7.
BEGIN TRAN 

SELECT * FROM TBL WITH (UPDLOCK) WHERE id=10.

WAITFOR DELAY '02:00' --Two hours

ROLLBACK 



А в другой во время паузы

Код: sql
1.
2.
3.
UPDATE TBL 
SET <поменять что-то >
WHERE id=10



, то будет что?
Ожидание или незамедлительное обновление сроки?
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969698
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

конечно ожидание, первая сессия как ужерживала U-блокировку так и будет удерживать до конца транзакции.

все что происходит между моментом получения блокировки и до commit/rollback не важно, там может быть и waitfor и бесконечный цикл и какой нибудь out-process task.

имхо единственное оправданное решение использования waitfor в циклах: это попытка сокращения потребления CPU на шаг итерации при реализации некоторой степени обработки асинхронного процесса.

к примеру встречал системы которые продолжают какой либо шаг бизнес логики при появлении некоего семафора (значения в таблице или налии строки) аля

Код: sql
1.
2.
3.
4.
5.
6.
while 1 = 1 begin
       if exists (select 1 from sometable) break;
       waitfor delay '00:00:01' --вот тут вполне оправдано при такой конструкции
end;

--делаем что то дальше blablabla
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969700
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка,

надо смотреть на контекст выполнения процедур. Например, это проверка каких-либо данных по расписанию. чтобы не делать джоб, который стартует каждые 2 секунды и забивает журнал выполнения.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969716
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
SIMPLicity_
ремя отработки единичной итерации - менее 1 секунды

Имеется в виду получение кода возврата от ОС или реальное завершение всех потоков вызванного процесса и освобождение всех ресурсов?


Похоже, что Win Server не торопился что-то завершать и вызовы xp_cmdshell со стороны MSSQL порождали кучу потоков.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969717
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
SIMPLicity_,

Если вы откроете транзакцию и запустите waitfor, то очевидно, что блокировки зависнуть и съеденные ресурсы будут висеть занятыми.



Транзакции внутри запросов на linked-сервер открывались и закрывались ВНУТРИ одного блока. waitfor delay оказывался МЕЖДУ блоками. Тут проблем ни когда не было...
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969730
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

[quot a_voronin#22151444]
alexeyvg
пропущено...


Что значит "вне транзакции"?

То есть если сделать в одной транзакции

Код: sql
1.
2.
3.
4.
5.
6.
7.
BEGIN TRAN 

SELECT * FROM TBL WITH (UPDLOCK) WHERE id=10.

WAITFOR DELAY '02:00' --Two hours

ROLLBACK 



А в другой во время паузы

Код: sql
1.
2.
3.
UPDATE TBL 
SET <поменять что-то >
WHERE id=10



, то будет что?
Ожидание или незамедлительное обновление сроки?



a_voronin

Что значит "вне транзакции"?


Что-то типа этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @cmd nvarchar(max);
while 1=1
  begin
     select @cmd = ' set nocount on; declare @var nvarchar(100)='просто так';
                            BEGIN TRAN  ; 
                                 select @var = isnull(max(..)) from ... with (tablockX); 
                                 insert into ... ; 
                             COMMIT TRAN   ;  ' ;
     execute (@cmd) at [LinkedServer] ;
     waitfor delay   '1' ;)
  ....
  end;
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969740
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Мой знакомый как-то удивился, увидев в индусском SQL-коде удаление в цикле построчно. Не помню, был там сабж или нет.
Я ему объяснил, что так, по мнению автора, снижается блокировка важной таблицы. :)

Примерно то же самое и в сабже: для снижения нагрузки и блокировок.


Есть такая фигня и у меня - удаляю блоками примерно по 100 штук в течении нескольких часов с паузами в 10 сек. Если запустить просто удаление, то таблица блокируется и клиентский софт начинает отваливаться по тайм-ауту. Есличо,- таблица не моя, софт не мой, я так - "убраться позвали" ;) ... График использования таблицы - уже 24 х 7 ,- и как всегда,- стал таким неожиданно(!)...
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969807
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На пути превращения юзера Начинучка в Кончучка - вот еще кандидат на дискуссию "sp_getapplock"
Тоже что-то перпендикулярное
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #39969923
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Что значит "вне транзакции"?

То есть если сделать в одной транзакции

Код: sql
1.
2.
3.
4.
5.
6.
7.
BEGIN TRAN 

SELECT * FROM TBL WITH (UPDLOCK) WHERE id=10.

WAITFOR DELAY '02:00' --Two hours

ROLLBACK 

Значит, нет строки BEGIN TRAN.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #40087886
philips
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
a_voronin,


Код: sql
1.
2.
3.
4.
5.
6.
while 1 = 1 begin
       if exists (select 1 from sometable) break;
       waitfor delay '00:00:01' --вот тут вполне оправдано при такой конструкции
end;

--делаем что то дальше blablabla


Объясните популярно. Мне надо выставить флаг .
Допустим добавить запись с ключом
Код: sql
1.
select 1 from sometable


Потом 10 секунд проверять изменение ключа другой процедурой(процессом) . Если он изменен, то выйти сразу, если нет - то обязательно через 10 секунд. Попробовал изменить в другом скрипте - все равно ждет 10 секунд
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #40087934
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
philips,

запомните время начала цикла и сравнивайте разницу с текущим временем при каждой итерации.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #40088070
philips
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может я неправильно объяснил , но я решил эту проблему просто
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
declare @i int=20

while @i>0
Begin
      if not exists (select reason from dbo.alkogol where reason is  null) break;
       waitfor delay '00:00:01' --вот тут вполне оправдано при такой конструкции
       set @i=@i-1
end;


В другом скрипте
Код: sql
1.
update  dbo.alkogol set Reason =1


и он выходит. Задача тестовая.
Главное что теперь я могу повесить на сторонний драйвер проверку флага и решить вопрос только скриптами T-SQL
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #40088090
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
для такой задачи наверное более подойдет сервис-брокер. можно добиться точной задержки в 10 сек и без лишних вычислений.
краткое описание
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #40088108
philips
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не большой спец по SQL. Это перспективная одноразовая задача. Просто надо что сервер 20 (или другое) с. проверял флаг, если он не снят - Закончить цикл в любом случае. Это алкотестер на проходной, какие придурки прицепили свой контроллер, программу и т.д. которые постоянно конфликтуют с существующим.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #40088215
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
philips,

на самом деле вы не можете знать - сколько времени будет выполняться запрос, поэтому, в общем случае, ваше решение некорректно.
Вы получите 1 секунда + запрос, это легко может выйти за пределы 10 секунд.
...
Рейтинг: 0 / 0
WAITFOR DELAY в while-циклах - требование стандарта или "бзик" программиста?
    #40088224
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
philips,

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


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