SQL Server - 批处理和 1 秒等待

时间:2021-02-17 22:41:35

标签: sql-server

我正在更新一个表中超过 1 亿的行。为了减少被锁定(甚至是表锁定)的行数,我正在使用 while 循环和一次递增 10k 行的组合来处理更新。

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

答案 0 :(得分:0)

RE:“为了减少被锁定(甚至是表锁定)的行数...”

总的来说,你有一个很好的方法。建议:

  1. 我建议您将 UPDATE 包装在显式事务中。在每次迭代中提交事务。否则,您将面临 100,000 百万行事务的风险。显式事务意味着我知道它已提交。 BEGIN TRAN ... UPDATE ... COMMIT TRAN。我每次都使用显式事务处理此类工作。
  2. 将增量从 10,000 减少。我在所有情况下都使用 1,000。您可以运行测试来确定将触发表锁定的确切数字。您可以阅读 Microsoft 2012 年锁升级指南(锁升级因版本而异)。但是,当我这样做时,我的目标是永远不要锁定表。强调“从不”。我只用了 1,000,晚上睡得更好。我为你推荐1000。但是,您的里程可能会有所不同。
  3. 移除 WAITFOR。出于此循环的目的,它只会将运行时间增加数小时(1 亿行上的原始 10,000 增量为 10,000 秒)。

希望有帮助。我已经在表上完成了 50 到 100 个这样的操作,将它们变成了数十亿行。键(如上所述):永远不要锁定表并提交每次迭代以保持事务较小。小额交易是您的朋友,原因有很多。

相关问题