【问题标题】:delete first X row Ingres ANSI删除第一个 X 行 Ingres ANSI
【发布时间】:2018-01-15 01:36:52
【问题描述】:
我有 730000 多条记录需要在 Ingres db 中删除,这些记录与 ANSI92 配合使用,然后我需要在不重载 db 的情况下删除,简单删除 where 搜索条件不起作用,DB 只使用所有内存并出现错误。考虑循环运行它,并按部分 10-20K 的记录删除。
我尝试使用top,但它不起作用
delete top (10)from TABLE where web_id <0 ;
,也想用Limit也没用
DELETE FROM from TABLE where web_id <0 LIMIT 10;
任何想法如何做到这一点?谢谢!
【问题讨论】:
标签:
sql
dml
ingres
ansi-92
【解决方案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);
当您说“没有重载 db”时,您的意思是避免达到事务日志文件的强制中止限制吗?如果是这样,可能对您有用的是:
set session with on_logfull=notify;
delete from table where web_id<0;
这将在达到强制中止然后继续执行的点自动提交您的事务,而不是回滚并报告错误。
使用此设置的一个缺点是,如果发生任何其他错误(您的工作可能会部分提交),取消选择已完成/未完成的操作可能会很棘手,但因为这似乎是从表中直接删除应该很明显哪些行保留,哪些不保留。
“设置会话”语句必须在事务开始时运行。
我建议不要使用“on_logfull=notify”运行并发会话(这方面存在错误,它们是否在您的安装中得到修复取决于您的版本/补丁级别)。