Oracle数据库delete删除普通堆表千万条记录

Oracle数据库delete删除普通堆表千万条历史记录。

直接删除的影响:

1.可能由于undo表空间不足从而导致最终删除失败的问题;

2.可能导致undo表空间过度使用,影响到其他用户正常操作。

改进方案:每删除1k行就提交一次。(这样就把一个大事物拆分成了若干个小事物)

注意:下面方法以删除2014年之前的所有记录为例,请根据你的实际情况修改,防止误操作。

方法

declare
     cursor [del_cursor] is select a.*, a.rowid row_id from [table_name] a order by a.rowid;
begin
     for v_cusor in [del_cursor] loop
          if v_cusor.[time_stamp] < to_date('2014-01-01','yyyy-mm-dd') then
               delete from [table_name] where rowid = v_cusor.row_id;
          end if;
          if mod([del_cursor]%rowcount,1000)=0 then
               commit;
          end if;
     end loop;
     commit;
end;

变量说明:

[del_cursor] 游标名

[table_name] 你要删除数据的表名

[time_stamp] 你用作过滤条件的表的时间字段名称

posted @ 2019-03-07 16:21  高伟-林州  阅读(1005)  评论(0编辑  收藏  举报