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

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

直接删除的影响:

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

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

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

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

方法1

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中变量说明:

[del_cursor] 游标名

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

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

方法2

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中变量说明:

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

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

Note

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

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

时间: 2024-08-03 20:40:15

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

Oracle 分区表的新增、修改、删除、合并。普通表转分区表方法

一. 分区表理论知识 Oracle提供了分区技术以支持VLDB(Very Large DataBase).分区表通过对分区列的判断,把分区列不同的记录,放到不同的分区中.分区完全对应用透明.Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中.查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询. When to Partition a Table什么时候需要分区表,官网的2个建议如下: Tables g

[生产库实战] 采用存储过程对生产线历史表数据进行归档

生产线历史数据归档是数据库运维的一项日常基本工作.在建表设计时,通常都将数据流水表(如:日志.用户登录历史,软件下载记录,用户属性更改历史表等)设计为范围分区表.间隔分区表(11G),当超过业务要求的保留范围时,此数据基本是静态数据且应用程序再不对其进行访问,但有可能会由于某些特殊要求需要手动查询.在这个情况下,都将其数据从生产库归档至历史库,并对其进行压缩保存,如果超出特殊要求查询的范围,那就直接将其导出压缩备份到磁带. 在Oracle数据库中,用做表数据归档操作的方法很多,如:exp/imp

Oracle删除当前用户下所有表数据

declare cursor cur is select table_name from user_tables; currow cur%rowtype; str varchar(2000); begin for currow in cur loop str:='truncate table '||currow.table_name; execute immediate str; dbms_output.put_line(str); end loop; end;

Oracle自增主键的添加[sequence]--表数据已存在

--增加主键ID alter table CLERK_COMPARE add id number(16); --设置sequence使ID自增 create sequence SEQ_ID minvalue 1 maxvalue 999999999 start with 1; --将id的值设置为sequence Update clerk_compare set id=seq_id.nextval; commit; --设置id为主键 alter table CLERK_COMPARE add

堆表空间管理

在SQL Server中,堆表是指没有创建聚集索引的表,其存储空间由PFS,IAM等系统页来跟踪,PFS使用1Byte,表示一个page中空间的使用情况.BTree结构的存储空间是有序的,当向BTree结构中插入新的数据行时,SQL Server按照键值该数据行插入到特定的位置上,以保证BTree结构是有序的:当删除一个Page中的所有数据行之后,SQL Server会将该Empty Page释放,其他对象可以使用该Page.堆表的空间管理,和BTree结构有很大的不同. 1,读取堆表的数据 当

堆表修改内幕

堆的修改需要使用到PFS页(PageFreeSpace).PFS记录着数据页的空间使用情况.PFS页上使用1个字节(Byte)表示一个页的使用情况.一个PFS页可以表示8088个数据页,于是每8088个数据页就会有一个PFS页.一个数据文件的第二个页就是PFS页.PFS页上1个字节的结构: Bit 1:是否被分配并使用.比如,分配给对象的统一区,并不是区内所有的页都被使用.此位就用标示已分配区中页是否被真正使用. Bit2:表示页是否来自混合区 Bit3:表示页是否是一个IAM页(Index A

SQL表关联赋值、系统表、表数据删除

1. 表与表的关联赋值(用于表与表之间有关联字段,数据互传) 双表关联赋值 UPDATE #B SET #B.D=#A.B from #B inner join #A on #B.C=#A.A 多表关联赋值 update a set a.e=c.n from a left join b on a.e=b.j left join c on b.k=c.m 2. 两种删除方式(TRUNCATE TABLE <--> DELETE FROM) TRUNCATE TABLE #USER 删除极快,无日

ORACLE访问数据的方法

这篇是整理复习oracle关于访问表数据的方法,在oracle数据库中,要想访问存储在数据库中的数据, 要依次经历下面几个步骤: 待执行的SQL ----> 解析 ----> 优化器处理 ----> 生成执行计划 ----> 实际执行 ----> 返回执行结果, 其中,在优化器的处理这个阶段,来决定访问目标表数据的方式,即优化器要采用什么方式去访问具体 的数据. 在oracle中访问表的方式分为两种,一种是直接访问表,一种是先访问索引,再回表(当然,还有可能 只访问索引就可以

Oracle闪回查询恢复delete删除数据

Flashback query(闪回查询)原理 Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. Flashback query(闪回查询)前提: SQL> show parameter undo; NAME                                TYPE       VALUE ------------------------------------ ----------- --------