Я работаю над обновлением более 100 миллионов строк в таблице. Чтобы уменьшить количество заблокированных строк (или даже блокировку таблицы), я обрабатываю обновления с помощью комбинации цикла while и увеличения 10 тыс. Строк за раз.

Я запускаю это на SQL Server 2012.

DECLARE @i int = 0
DECLARE @last int = 10000000

WHILE @i <= @last
BEGIN
    UPDATE mytbl (ROWLOCK)
    SET foo = null
    WHERE id BETWEEN @i AND @i + 10000

    SET @i += 10000

    WAITFOR DELAY '00:00:01'
END

Делает ли 1-секундное ожидание в коде что-нибудь с точки зрения повышения производительности, фиксации / сброса транзакции или снятия блокировок транзакции?

1
VarDeltaNot 18 Фев 2021 в 01:41

1 ответ

Лучший ответ

RE: «Чтобы уменьшить количество блокируемых строк (или даже блокировку таблицы) ...»

В общем, подход у вас хороший. Рекомендации:

  1. Я рекомендую вам заключить UPDATE в явную транзакцию. Зафиксируйте транзакцию на каждой итерации. В противном случае вы рискуете получить транзакцию на 100 000 миллионов строк. Явные транзакции означают, что я знаю, что они совершены. НАЧАТЬ ТРАНС ... ОБНОВИТЬ ... ЗАВЕРШИТЬ ТРАНС. Я каждый раз использую явные транзакции для этого типа работы.
  2. Уменьшите шаг с 10,000. Я использую 1000 во всех случаях. Вы можете запустить тесты, чтобы определить точное число, которое вызовет блокировку таблицы. Вы можете прочитать рекомендации Microsoft по эскалации блокировок на 2012 год (эскалация блокировок зависит от версии). Но когда я делаю это, моя цель - никогда не блокировать таблицу. Акцент на «никогда». Я просто употребляю 1000 и лучше сплю по ночам. Я рекомендую вам 1000. Но ваш пробег может отличаться.
  3. Удалите WAITFOR. Для целей этого цикла он только добавляет часы ко времени выполнения (10 000 секунд для первоначального приращения 10 000 для 100 миллионов строк).

Надеюсь, это поможет. Я сделал от 50 до 100 таких операций на таблицах в миллиарды строк. Ключи (как указано выше): никогда не блокировать таблицу и фиксировать каждую итерацию, чтобы транзакция была небольшой. Небольшие транзакции - ваш друг по многим причинам.

0
jim 18 Фев 2021 в 00:57