1

我需要在 sybase 中进行大量更新。

表 1 有 a、b、c、e、f 列,大约 900 万条记录。表 2 有 a、e、f 列,大约 500000 条记录。

由于系统日志已满,波纹管更新 sql 失败

update table1
set e = table2.e, f = table2.f
from table1, table2
where table1.a = table2.a

在互联网上进行研究后,由于同样的错误,以下两个程序仍然失败,但它们确实成功更新了 5000 条记录。

有任何想法吗。谢谢!

SET ROWCOUNT 5000
WHILE (1=1)
    BEGIN 

   update table1
set e = table2.e, f = table2.f
from table1, table2
where table1.a = table2.a

    IF @@ROWCOUNT != 5000
        BREAK
    END
SET ROWCOUNT 0


declare @errorStatus int, @rowsProcessed int
set rowcount 5000

select @rowsProcessed = 1
while (@rowsProcessed != 0)
begin
  begin tran

   update table1
set e = table2.e, f = table2.f
from table1, table2
where table1.a = table2.a

    select @rowsProcessed = @@rowcount, @errorStatus = @@error

    if (@errorStatus != 0)
    begin
       --raiserror ....
       rollback tran
       --return -1
    end
  commit tran
end

set rowcount 0
4

1 回答 1

1

您的系统日志设备似乎不足以完成您要完成的任务,并且日志可能不会被截断。

sp_helpdb <DBNAME>应该检查数据库的设置(trunc log on chkpt

要解决此问题,您必须向数据库添加日志空间、手动转储日志或设置数据库选项以在检查点截断日志。

如果您担心系统或磁盘故障时的最新恢复,那么您应该添加日志空间,并安排更频繁的日志转储。

如果您不担心最新的恢复,那么您可以打开数据库选项以截断检查点上的日志。

sp_dboption <DBNAME>, 'trunc log on chkpt', true
于 2015-05-29T20:18:06.467 回答