首页 > 代码库 > 记录数过亿条的表数据维护-数据删除

记录数过亿条的表数据维护-数据删除

当一张表数据很大的时候,由于数据删除的时候时间会很长,事务很大,所需的undo段将会比较大,未提交的话,undo段数据会受到保护,这将影响其它事务的操作-执行时间会变长或者挂起,所以删除大表数据的时候尽量将大事务切分成小事务去做,下面的存储过程是删除表数据时没10万行一提交。

declare  

  cursor cur is select rowid from tab1 where   xx<nnn order by rowid;

   type rowid_table_type is  table  of rowid index by pls_integer;

   v_rowid   rowid_table_type;

BEGIN

   open cur;

   loop

      fetch   cur bulk collect into v_rowid  limit 100000;

      exit when v_rowid.count=0;

     forall i in v_rowid.first..v_rowid.last

        delete from tab1 where rowid=v_rowid(i);

     commit;

   end loop;

close cur;

END

      数据删除结束后,表的实际存储空间未被释放,这时需要需要对数据段进行收缩,如下

要使用assm上的shink,首先我们需要使该表支持行移动,可以用这样的命令来完成:

SQL> alter table tab1 enable row movement;

现在,就可以来降低tab1的HWM,回收空间了,使用命令:

SQL> alter table my_objects shrink space;(次操作尽量放到系统空闲的时候去做)。

空间收缩后,由于表的数据比较大,此时应该收集优化器统计信息,以使优化器做出正确的执行计划选择。

exec dbms_stats.delete_table_stats(ownname=>‘user_name‘,tabname=>‘table_name‘,cascade_indexes=>true);

 

本文出自 “ORACLE/DB2/MYSQL” 博客,谢绝转载!

记录数过亿条的表数据维护-数据删除