zoukankan      html  css  js  c++  java
  • oracle 大表删除数据后,回收空间的问题。

    在oracle中由于表结构设计不合理或者需要清楚老数据的时候,经常需要对大表数据进行清理。

    一般有一下几种方法:

         1. 删除大部分数据,留下小部分数据。我们可以把需要保留的数据转移到别的表,然后再把大表drop掉,然后改名就行了;

              a) create table tablename_min as select * from tablename_max a where 需要保留的数据.

              b) drop table tablename_max ;

              c) rename tablename_min as tablename_max ;

           这样就能清除这个大表的hwm,而且释放掉其他空间。
         2.当删除的数据只是一小部分数据的话,第一种方法就不适用了。比如 3亿条数据,你删除一亿条数据的话,用1就不合适。

        这时我们就应该考虑使用shrink table的方式。

             a) 我们可以先用delete from tablename_max;

             b) 由于我们进行了数据的delete 所以造成了 tablename_max 这张表的数据稀疏,数据块并没有减少,hwm也没有减少,这样就会影响全表扫描需要访问更多的数据块。这时我们可以通过shrink来重组数据使数据分布更紧密,同时降低HWM释放空闲数据块。

            c)由于需要移动行数据,数据的rowid会发生变化,所以需要设置表的row movement属性:
                alter table tablename_max enable row movement; --开启行迁移功能。
                alter table tablename_max shrink space compact;--(可以在压缩期间进行DML操作和查询) ,收缩表,不会降低hwm
                alter table tablename_max shrink space; --( 调整HWM时将阻塞DML操作),收缩表,并且降低hwm

                alter table tablename_max shrink space cascade;--收缩表并降低hwm,并且回收相应的索引。

                 由于我们删除了大量的数据 ,相应的索引也进行了删除,这时需要对索引进行收缩。

                alter index idxname shrink space;
           注意:shrink table只会针对assm(自动段空间管理)的表有用,否则会报: ORA-10635: Invalid segment or tablespace type。

                     alter table tablename_max enable row movement语句会造成引用表tablename_max的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。

                    
       由于是通过DML操作进行的,会产生大量redo,注意archivelog目录的空间大小问题;同时undo表空间也会暴增。

  • 相关阅读:
    USACO Milk2 区间合并
    Codeforces 490B Queue【模拟】
    HDU 3974 Assign the task 简单搜索
    HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)
    Cin、Cout 加快效率方法
    POJ 1159 回文LCS滚动数组优化
    POJ 2479 不相交最大子段和
    POJ 1458 最长公共子序列 LCS
    在阿里最深刻的,还是职场之道给我的震撼
    精细化
  • 原文地址:https://www.cnblogs.com/mr-hero/p/5818003.html
Copyright © 2011-2022 走看看