Запрос на обновление миллионов строк заполняет журнал транзакций - PullRequest
0 голосов
/ 21 июня 2010

Мне нужно обновить миллионы строк как часть моего следующего выпуска, но при этом заполняется журнал транзакций и происходит сбой.У меня есть несколько идей, но я не эксперт по SQL, поэтому я уверен, что будут ошибки, о которых я не знаю.

Соответствующие пункты:

  1. Мне нужночтобы передать скрипт операционной группе, так что нужен метод T-SQL без ручного вмешательства.
  2. Очевидно, что журнал транзакций перерабатывается каждые 15 минут.(Я думал о написании цикла с try-catch с WAITFOR DELAY '00:15:00' в блоке catch, как показано ниже)
  3. (EDIT) Я не могу ничего изменить, кроме данных.
  4. (РЕДАКТИРОВАТЬ) Это простое обновление, заменяющее столбец внешнего ключа на другой существующий ключ.

Спасибо,

Фил

DECLARE
    @AffectedRows int

SET @AffectedRows = 0

WHILE @AffectedRows < @RowsToUpdate
BEGIN
    BEGIN TRY
        BEGIN TRAN
        -- Do some updates  
        SET @AffectedRows = @AffectedRows + @@RowCount
        COMMIT TRAN
    END TRY
    BEGIN CATCH
        PRINT ERROR_MESSAGE()
        WAITFOR DELAY '00:15:00'
    END CATCH
END

PRINT @AffectedRows

Ответы [ 3 ]

2 голосов
/ 22 июня 2010

В конце пример, который я уже написал, работал лучше всего;в журнале обнаруживается полная ошибка журнала транзакций, и 15 минут достаточно для повторного использования журнала.

DECLARE 
    @AffectedRows int 

SET @AffectedRows = 0 

WHILE @AffectedRows < @RowsToUpdate 
BEGIN 
    BEGIN TRY 
        BEGIN TRAN 
        -- Do some updates   
        SET @AffectedRows = @AffectedRows + @@RowCount 
        COMMIT TRAN 
    END TRY 
    BEGIN CATCH 
        PRINT ERROR_MESSAGE() 
        WAITFOR DELAY '00:15:00' 
    END CATCH 
END 

PRINT @AffectedRows
1 голос
/ 21 июня 2010

Несколько баллов / идей:

  1. Вы можете расширить свой журнал транзакций до любого желаемого размера, чтобы он не заполнял его.
  2. Если размер вашего журнала транзакций слишком велик, вы всегда можете сделать резервную копию вашей БД и обрезать журнал.
  3. Вы можете работать с данными в пакетном режиме (делать миллион за раз)
  4. Вы можете скопировать данные в рабочую таблицу и затем sp_rename их, когда обработка будет завершена.
0 голосов
/ 21 июня 2010

Вы заново изобретаете грызть удаления / обновления:)

Взгляните на этот подход, вы можете делать блоки большего размера, чем один ряд:

http://www.sqlservervideos.com/video/nibbling-deletes/

http://sqladvice.com/blogs/repeatableread/archive/2005/09/20/12795.aspx

...