Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Начинучка
Guest |
Всем привет! В одной из сопровождаемых систем при разглядывании хранимых процедур и T-SQL-скриптов в джобах заметил интересную особенность: везде, где применяется while-цикл последним оператором, засунутым в тело цикла, является вызов WAITFOR DELAY '00:00:01'. Подскажите - это личная инициатива разработчика данного кода или реальная насущная необходимость? Если насущная необходимость - то чем она вызвана? Некоторые циклы гоняются по паре-тройке десятков тысяч раз за один вызов процедуры. И получается, что в процессе выполнения таких СП накапливается до часу холостых ожиданий... З.Ы. Я не Козлов и не Баранов. Я с MS SQL недавно, не судите строго... :) |
30 сен 17, 15:27 [20833422] Ответить | Цитировать Сообщить модератору |
Начинучка
Guest |
Возможно, непонятно выразился... Хотел сказать следующее: есть много хранимок, T-SQL-джобов. в них часто используется цикл WHILE. В том числе и для реализации построчной обработки курсоров. последним оператором в WHILE-цикле всегда является вызов WAITFOR DELAY '00:00:01'. Вопрос: это так и надо или программист - параноик? |
||
30 сен 17, 15:32 [20833428] Ответить | Цитировать Сообщить модератору |
Prolog Member Откуда: Москва Сообщений: 2793 |
можете убрать waitfor в крайнем случае, поставить после завершения цикла while |
30 сен 17, 16:01 [20833443] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Мы таким подходом иногда пользуемся как элементом балансировки, к примеру, в "бесконечных" джобах, чтобы в холостую часто слишком не гонять, а то кушает таки процессор. А ставить такое в курсоре... разве что, чтобы потом быстро можно было увеличить скорость обработки в несколько раз, убрав эту строку. |
30 сен 17, 16:36 [20833460] Ответить | Цитировать Сообщить модератору |
Eleanor Member Откуда: Сообщений: 3214 |
Начинучка, Нашла в одной из своих систем - WAITFOR DELAY '00:00:02' везде, где идет отправка смс. Зачем, не знаю, возможно, какая-то особенность сервиса рассылки. Вдруг у вас что-то аналогичное. |
30 сен 17, 18:56 [20833626] Ответить | Цитировать Сообщить модератору |
Начинучка
Guest |
Eleanor, В моем случае чаще всего - либо чистка старых данных из таблиц, либо перенос данных из одной таблицы в другую. Везде сделано циклами через курсор, "пакетами" по 5-50 т. записей, и после каждой итерации цикла - завершающий WAITFOR... |
30 сен 17, 19:23 [20833644] Ответить | Цитировать Сообщить модератору |
Eleanor Member Откуда: Сообщений: 3214 |
Начинучка, Скорее всего разработчик думал, что обязательно нужно сделать waitfor между удалениями, чтобы другие запросы в эти интервалы имели возможность выполниться. Можно его удалить. |
1 окт 17, 00:30 [20834014] Ответить | Цитировать Сообщить модератору |
Eleanor Member Откуда: Сообщений: 3214 |
И вот, где разработчик мог такие идеи почерпнуть: deleting-1-millions-rows-in-sql-server Комментарий про то, что WAITFOR не нужен, он уже не прочитал. |
1 окт 17, 00:34 [20834019] Ответить | Цитировать Сообщить модератору |
Prolog Member Откуда: Москва Сообщений: 2793 |
Тогда можно использовать такой вариант: while ... begin ... delete ... set @rowcount = @@rowcount; ... if @rowcount = 0 waitfor ... ... end; |
||
1 окт 17, 06:34 [20834085] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 3986 |
[quot Начинучка]
Может программист - весёлый любознательный, решил проверить обнаружат ли и когда |
||
1 окт 17, 11:33 [20834239] Ответить | Цитировать Сообщить модератору |
iii2 Member Откуда: Сообщений: 202 |
У нас такие задержки разработчик вставил при удалении записей пакетами из большой "центральной" таблицы, которая связана с помощью декларативной ссылочной целостности on delete cascade c другими таблицами (не справочниками). При том, что таблица при удалении записей блокируется with tablock. Мотивировал именно такими соображениями - чтобы другие запросы, в т.ч. в другие таблицы - могли выполняться. Проверено, без этого НЕ работает. Возникают дэдлоки, другие запросы висят дольше, чем хотелось бы и т.д. Сервер 2008 (не R2) |
||
2 окт 17, 15:04 [20836531] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9646 |
Само собой, сказку сочинить гораздо легче, чем поработать головой... А вообще гениально - при удалении принудительно блокировать таблицу, потом удивляться почему конкурирующие сеансы не могут работать и лечить это паузами между удалениями. |
||
2 окт 17, 15:15 [20836561] Ответить | Цитировать Сообщить модератору |
iii2 Member Откуда: Сообщений: 202 |
Я подозреваю, что разработчик не разобрался с блокировками + каскадное удаление вносит свою лепту. В принципе, нас не беспокоит, т.к. это сборщик мусора, который удаляет помеченные записи по окончании опердня. Но факт остается фактом - без этого не работает. Впрочем, это меньшее, за что разработчику хочется натянуть его трусы на голову. |
||||
2 окт 17, 15:50 [20836671] Ответить | Цитировать Сообщить модератору |
iii2 Member Откуда: Сообщений: 202 |
Опять же подозреваю, что tablock был вставлен чтобы побороть дедлоки. Это не моя система, не знаю всех подробностей. |
||
2 окт 17, 15:54 [20836682] Ответить | Цитировать Сообщить модератору |
Eleanor Member Откуда: Сообщений: 3214 |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
я пишу WAITFOR DELAY в основном только в сервисных(разовых) скриптах, когда необходимо сделать массовую блочную операцию на объекте, из соображений освобождения ресурсов и уменшения конкуренции. Ну и кроме всего сервер делает массу операций кроме пользовательских, тот же сборщик удалённых записей, автообновление статистики... |
2 окт 17, 16:36 [20836845] Ответить | Цитировать Сообщить модератору |
ziktuw Member Откуда: Сообщений: 3552 |
Этот лайфхак принудительно заставляет текущий поток прерваться и дать квант времени работы другим потокам в очереди. Ровно за тем же в виндовых многопоточных приложениях в тяжелом потоке делают sleep(0). Правда, для этого не нужно делать паузу в секунду, а достаточно 30 миллисекунд (минимальная единица времени в типе датеtime). Ну и утилизация CPU в таком цикле с прерыванием существенно снижается - проверено практикой. Другим параллельным запросам легче проработать. |
5 окт 17, 16:15 [20845855] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
5 окт 17, 16:27 [20845894] Ответить | Цитировать Сообщить модератору |
dies irae Member Откуда: Сообщений: 78 |
а тут нет противоречия. если разработчик считает, что его поток не особо важен, он вполне может поставить waitfor, чтобы повысить скорость других потоков |
||||
5 окт 17, 17:28 [20846121] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
5 окт 17, 19:21 [20846354] Ответить | Цитировать Сообщить модератору |
dies irae Member Откуда: Сообщений: 78 |
вот иногда завидую людям, которые просто на ровном месте могут взять и посмеяться. Слегка неловко за них становится, ну да ладно |
||||
6 окт 17, 14:28 [20848435] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8350 |
При массовых загрузках/расчетах или индекс прибить на продакшне, а так - непонятно зачем. |
6 окт 17, 14:32 [20848466] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Сообщение было отредактировано: 6 окт 17, 15:15 |
||||
6 окт 17, 15:14 [20848683] Ответить | Цитировать Сообщить модератору |
dies irae Member Откуда: Сообщений: 78 |
Нет, это вы не понимаете. Поменьше высокомерия, шире кругозор, и не стоит делать выводов о ситуации не видя полной картины или хотя-бы одного куска кода. давно замечаю, что этому форуму не хватает презумпции компетентности. во всех начальных постах определённо делается вывод "КГ/АМ", хотя задачи бывают разные, базы разные, и подходы также могут встречаться абсолютно разные. Мир субд гораздо шире, чем вы себе представляете. И курсоры вполне имеют право на жизнь. Другое дело, что их часто лепят куда ни попадя, но в данном случае оснований для данного вывода НЕТ |
||||
6 окт 17, 16:29 [20848911] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
Сообщение было отредактировано: 6 окт 17, 16:35 |
||||||
6 окт 17, 16:33 [20848932] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |