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中的正确更新语句,以避免事务日志已满的主要内容,如果未能解决你的问题,请参考以下文章