【问题标题】: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”运行并发会话(这方面存在错误,它们是否在您的安装中得到修复取决于您的版本/补丁级别)。

    【讨论】:

    • 谢谢,这很有帮助!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    相关资源
    最近更新 更多