DB2中的正确更新语句,以避免事务日志已满

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DB2中的正确更新语句,以避免事务日志已满相关的知识,希望对你有一定的参考价值。

我想更新一个在unix上运行的DB2中有超过200万条记录的表。有没有办法以批量大小更新一次5000行?在Sybase中,我可以使用“set rowcount 5000”,如下所示:

set rowcount 5000
while ( 1=1 )
begin
 begin tran
  update X set ... where ...
  if (@@error != 0)
    begin
        rollback tran
        return 1
    end
 commit tran

if(  @@rowcount < 5000 ) break
end

set rowcount 0

如何在DB2中执行此操作?目的是尽量避免事务日志完全导致更新失败。

答案

您有两个选项,都涉及复合SQL。如果有一种方法可以确定哪些记录已更新,哪些记录未更新,您可以编写如下内容:

BEGIN
  WHILE EXISTS (SELECT 1 FROM yourtable WHERE <condition to find records to update>)
  DO
    UPDATE (SELECT * FROM yourtable WHERE <condition> FETCH FIRST 5000 ROWS ONLY)
      SET ...; -- updating 5000 rows at a time
    COMMIT;
  END WHILE;
END

如果您无法轻易区分更新的行和尚未更新的行,则可以执行以下操作:

BEGIN
  DECLARE i INT DEFAULT 0;
  FOR l AS cur CURSOR WITH HOLD FOR 
   SELECT * FROM yourtable WHERE ... FOR UPDATE
  DO
    UPDATE yourtable SET ... WHERE CURRENT OF cur;
    SET i = i + 1;
    IF MOD(i, 5000) = 0 THEN
      COMMIT; -- every 5000 rows
    END IF;
  END FOR;
  COMMIT; -- last set, may be less than 5000 rows
END

后一种选择显然效率较低,因为它逐行更新行,而不是5000行。

以上是关于DB2中的正确更新语句,以避免事务日志已满的主要内容,如果未能解决你的问题,请参考以下文章

数据库 'DJABC' 的日志已满.请备份该数据库的事务日志以释放一些日志空间.

SQL Server事务日志被填满的原因是啥

DB2数据库的事务日志已满。SQLSTATE=57011

由于活动事务,SQL Server 日志已满

db2怎么删除数据库的事务日志

Db2 事务日志已锁定,无法归档