前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle库Delete删除千万以上普通堆表数据的方法

Oracle库Delete删除千万以上普通堆表数据的方法

作者头像
Alfred Zhao
发布2019-05-24 20:40:18
1.8K0
发布2019-05-24 20:40:18
举报

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

直接删除的影响:

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

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

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

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

方法1

代码语言:javascript
复制
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;

方法1中变量说明:

代码语言:javascript
复制
[del_cursor] 游标名

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

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

方法2

代码语言:javascript
复制
declare  
maxrows number default 1000;
delete_ct number default 0;
begin
select count(1)/maxrows  into delete_ct from [table_name] where [time_stamp] < to_date('2014-01-01','yyyy-mm-dd');
for i in 1..TRUNC(delete_ct)+1
loop
delete [table_name] where [time_stamp] < to_date('2014-01-01','yyyy-mm-dd') and rownum <= maxrows;
commit;
end loop ;
end;

方法2中变量说明:

代码语言:javascript
复制
[table_name] 你要删除数据的表名

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

Note

两种方法的核心的思路都是把一个大事物拆分成了若干个小事物,无论采用哪种方法,都建议先在对应的测试环境中测试后再考虑是否可以在实际生产使用。

顺便说一句,这样的大表应该要综合考虑下是否可以改造成分区表。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-07-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法1
  • 方法2
  • Note
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档