具有外键依赖性的大规模更新

时间:2017-11-07 17:53:28

标签: sql-server tsql migration

我有以下查询:

update largeTable 
set largeTable_id ='NA'; 

如果我们谈论一个45米的记录表,我想知道执行这种更新的最佳做法是什么。我应该考虑级联更新吗?或者这是自动完成的吗?

我将以下查询作为示例在不同的批处理中执行更新,以避免出现tlog空间问题:

DECLARE @i INT=1 

WHILE (@i <= 10) 
BEGIN
    UPDATE TOP(20000) largeTable 
    SET largeTable_id = 'NA'

    SET @i = @i + 1 
END

所以,这几乎就是这个想法,任何意见或建议都会受到赞赏。

提前致谢:)。

添加新想法:

--T-SQL using the ROWCOUNT setting to control update size
SET ROWCOUNT 1000 

WHILE (1 = 1) 
BEGIN 
    BEGIN TRANSACTION 

    UPDATE tableB 
    SET TableB_TableA_id = 'NA'; 

    IF @@ROWCOUNT = 0 
    BEGIN 
        COMMIT TRANSACTION 
        BREAK 
    END 

    COMMIT TRANSACTION
END 

SET ROWCOUNT 0

主要目标是以多个批次执行该更新,避免在tlog数据文件中出现问题,并执行级联更新而不会出现性能问题。

1 个答案:

答案 0 :(得分:0)

DECLARE @AffectedRows INT, @BatchSize INT;

SET @BatchSize = 5000;    
SET @AffectedRows = @BatchSize;

WHILE (@Rows = @BatchSize)
BEGIN
  UPDATE TOP (@BatchSize) tableB 
  SET   TableB_TableA_id='NA'
  WHERE TableB_TableA_id <> 'NA';

  SET @AffectedRows = @@ROWCOUNT;
END;