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

Posted lcword

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录数过亿条的表数据维护-数据删除相关的知识,希望对你有一定的参考价值。

  对一些big table,由于数据删除的时候时间会很长,事务很大,所需的undo段将会比较大,未提交的话,undo段数据会受到保护,这将影响其它事务的操作-执行时间会变长或者挂起,所以删除大表数据的时候尽量将大事务切分成小事务去做,下面的pl/sql 匿名块是删除表数据时每10万行一提交。

技术图片
 1 declare  
 2 
 3   cursor cur is select rowid from tab1 where   xx<nnn order by rowid;
 4 
 5    type rowid_table_type is  table  of rowid index by pls_integer;
 6 
 7    v_rowid   rowid_table_type;
 8 
 9 BEGIN
10 
11    open cur;
12 
13    loop
14 
15       fetch   cur bulk collect into v_rowid  limit 100000;
16 
17       exit when v_rowid.count=0;
18 
19      forall i in v_rowid.first..v_rowid.last
20 
21         delete from tab1 where rowid=v_rowid(i);
22 
23      commit;
24 
25    end loop;
26 
27 close cur;
28 
29 END
30 
31  
技术图片

 

      注:数据删除结束后,表的实际存储空间未被释放,这时需要需要对数据段进行收缩,如下要使用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);

以上是关于记录数过亿条的表数据维护-数据删除的主要内容,如果未能解决你的问题,请参考以下文章

如何利用Python分析14亿条数据!资深程序员手把手教你!过亿级!

mysql数据库要放1亿条信息怎样分表?

处理数十亿条记录的推荐数据库类型

删除范围内的十亿条记录与精确 ID 查找 MYSQL

MySQL 分区表,为啥分区键必须是主键的一部分?

MySQL 的优化记录