数百万行的更新查询填充事务日志

时间:2010-06-21 10:08:51

标签: sql-server-2005 tsql transaction-log

我需要在下一个版本中更新数百万行,但这样做会填充事务日志并失败。我有一些想法,但我不是SQL专家所以我确信会有一些我不知道的问题。

相关要点:

  1. 我需要将一个脚本交给运营团队,因此需要一个没有人工干预的T-SQL方法。
  2. 显然,事务日志每15分钟就会被回收一次。 (我已经考虑过在catch块中用WAITFOR DELAY '00:15:00'编写一个带try-catch的循环,如下所示)
  3. (编辑)除数据外,我无法修改任何内容。
  4. (编辑)这是将外键列更改为其他现有密钥的简单更新。
  5. 谢谢,

    菲尔

    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 个答案:

答案 0 :(得分:2)

最后,我编写的例子效果最好;一个事务日志完整错误被捕获,并且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 :(得分:1)

一些观点/想法:

  1. 您可以将事务日志扩展到您想要的任何大小,因此它不会填充它。
  2. 如果您的事务日志增长太多,您可以随时备份数据库并截断日志。
  3. 您可以批量处理数据(一次做一百万)
  4. 您可以将数据复制到工作表,然后在处理完成后将其sp_rename。

答案 2 :(得分:0)

你正在重新发明蚕食删除/更新:)

看看这种方法,你可以做比单行更大的块:

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

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