Блокировка строк при запуске оператора update в производственной среде - PullRequest
3 голосов
/ 13 октября 2011

Мне интересно, какое правильное решение приведено ниже:

У меня есть оператор UPDATE в T-SQL, который нужно запускать как ежедневную задачу.Процедура обновит один битовый столбец в одной таблице.Число затронутых строк составляет около 30 000.

Псевдо-версия T-SQL

UPDATE TABLE_NAME
SET BIT_FIELD = [dbo].[FUNCTION](TABLE_NAME.ID)
WHERE -- THIS ISN'T RELEVANT

Функция, которая определяет истину или ложь, в основном выполняет несколько проверок и обращается к 3 другим таблицам.В настоящее время процедура занимает около 30 минут для запуска и обновления 30 000 строк в нашей среде разработки.Я ожидал, что это удвоится на производстве.

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

Обратите внимание, что процедура не заключена в транзакцию.

Если я запускаю каждое обновление в отдельном UPDATE заявление это исправит?Что было бы хорошим решением при обновлении довольно большого количества записей в живом окружении?

Любая помощь будет высоко ценится.

Спасибо!

1 Ответ

1 голос
/ 21 октября 2011

В вашем случае оптимизатор SQL Server, вероятно, определил, что для обновления вашей таблицы необходима блокировка таблицы. Вы должны выполнить доработку своего запроса, чтобы эта блокировка таблицы не возникала или оказывала меньшее влияние на ваших пользователей. Таким образом, на практике это означает: (а) ускорить ваш запрос и (б) убедиться, что таблица не заблокируется.
Лично я бы рассмотрел следующее:
1. Создайте кластеризованные и некластеризованные индексы в ваших таблицах, чтобы повысить производительность вашего запроса.
2. Посмотрите, возможно ли не использовать функцию, но вместо этого использовать соединения, как правило, они работают намного быстрее.
3. Разбейте обновление на несколько частей и выполните эти части отдельно. Возможно, в предложении «где» есть предложение «или», это хорошая точка расщепления, но вы также можете рассмотреть возможность создания курсора для циклического перемещения по таблице и выполнения обновления одной записи за раз.

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