zoukankan      html  css  js  c++  java
  • 记录数过亿条的表数据维护-数据删除

      对一些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);

  • 相关阅读:
    Mysql 之导入导出
    Go gin之文件上传
    记录Go gin集成发送邮件接口的坑
    关于mysql某个用户无法登陆的情况
    面向对象程序设计的分析基本步骤
    提示框判断事件
    事件响应的公共方法
    IComparable<T>.CompareTo(T) 方法
    浏览器缓存机制
    PHP中include和require
  • 原文地址:https://www.cnblogs.com/lcword/p/11553129.html
Copyright © 2011-2022 走看看