运行长更新脚本

时间:2018-03-19 00:13:30

标签: sql sql-server database

我试图找到类似的东西,但不能这么决定直接问。

我正在运行长批量更新脚本,它正在更新~50m记录。更新已批量分解,检查点允许清除事务日志。试图现在运行两次脚本,第一次在更新大约17米行后断开,第二次在14米处停止。

错误消息:消息1222,级别16,状态43,行122 锁定请求超时时间超过

这是伪代码:

BEGIN TRANSACTION

CREATE TABLE #Update (
    I_ID int PRIMARY KEY NOT NULL IDENTITY(1,1),
    PrimaryKeyID bigint NOT NULL,
    UpdateValue int
)

DECLARE @RecordsToUpdate int
DECLARE @ChunkCount int = 25000
DECLARE @CommitCount int = 100000
DECLARE @CheckpointCount int = 500000

-- Populate the whole table and values. 
...
-- Update the data. 
WHILE @RecordsUpdated < @RecordsToUpdate 
BEGIN
    SET @CurrentRecordsToUpdate = @RecordsUpdated + @ChunkCount

    UPDATE RealTable
    SET Val = UpdateVal
    FROM #Update
        INNER JOIN RealTable ON RealTable.PrimaryKeyID = #Update.PrimaryKeyID
    WHERE #Update.I_ID BETWEEN @RecordsUpdated AND @CurrentRecordsToUpdate

    SET @RecordsUpdated = @CurrentRecordsToUpdate

    IF @RecordsUpdated % @CheckpointCount = 0
    BEGIN
        CHECKPOINT
    END

    IF @RecordsUpdated % @CommitCount = 0
    BEGIN
        COMMIT TRANSACTION
        BEGIN TRANSACTION
    END

END

COMMIT TRAN

我在另一个数据库中运行它,其中行数较小(约20米)并且它运行得很好。任何想法或想法将不胜感激。它不太可能与另一个交易发生冲突,因为系统因更新而被撤下。 附:如果重要的话,它在SQL Server 2014上。

1 个答案:

答案 0 :(得分:0)

目前尚不确定这是否是问题,但在查看SSMS设置后,查询执行&gt;高级,我发现SET Lock Timeout参数设置为10000.很有可能将其更新为-1可能会解决问题。