0

我有 730000+ 条记录需要在 Ingres db 中删除,这些记录与 ANSI92 一起使用,然后我需要删除而不重载 db,简单删除搜索条件不起作用,DB 只使用所有内存和 trowing 错误。考虑循环运行它,并按部分 10-20K 的记录删除。

我尝试使用 top 并没有用

 delete top (10)from TABLE where web_id <0 ;

,也试图使用限制也没有工作

DELETE FROM from TABLE where web_id <0  LIMIT 10;

任何想法怎么做?谢谢 !

4

1 回答 1

1

您可以使用会话临时表来保存前 10 个 tid(元组 id),然后根据这些删除:

declare global temporary table session.tenrows as
select first 10 tid the_tid from "table" where web_id<0
on commit preserve rows with norecovery;

delete from "table" where tid in (select the_tid from session.tenrows);

当您说“没有过载数据库”时,您的意思是避免达到事务日志文件的强制中止限制吗?如果是这样,可能对您有用的是:

set session with on_logfull=notify;
delete from table where web_id<0;

这将在达到强制中止然后继续的点自动提交您的事务,而不是回滚并报告错误。使用此设置的一个缺点是,如果发生任何其他错误(您的工作可能会部分提交),取消选择已完成/未完成的操作可能会很棘手,但因为这似乎是从表中直接删除应该很明显哪些行保留,哪些不保留。“设置会话”语句必须在事务开始时运行。我建议不要使用“on_logfull=notify”运行并发会话(这方面存在错误,它们是否在您的安装中得到修复取决于您的版本/补丁级别)。

于 2018-01-15T08:33:23.830 回答