服务器空间不够,网上搜到有人问相似的问题,单表300G的数据,想根据delete 加约束条件删除部分数据,但是大家都知道delete不会释放表空间,请问有什么好的方法么?导入导出的感觉不太实际,一是数据太大,二是系统也在实时跑的,肯定有影响。delete操作我已经在做了,就几百万几百万的删记录,但是空间不释放的。这操作是一同事让我做的,我跟他说了delete不释放空间的,他说让我先删着,是不是他晚上还做了其他释放空间的操作了?不然有什么意义。
类似MSSQL的收缩数据库后数据库就明显变小很多,oracle有什么方式吗?大侠们给点意见吧,我自己现场试试效果user_segments表里查看表占用的空间

解决方案 »

  1.   

    如果是整表删除,并且不涉及回滚,则建议使用TRUNCATE... 无需COMMMIT.
      

  2.   

    10g及其以上版本可以使用shrink 
    或者在线重定义
      

  3.   

    若要彻底删除表,则使用语句:drop tablepurge; 清除回收站里的信息 清除指定表:purge table ; 清除当前用户的回收站:purge recyclebin; 清除所有用户的回收站:purge dba_recyclebin; 不放入回收站,直接删除则是:drop table xx purge;
    truncate table 后,有可能表空间仍没有释放,可以使用如下语句: alter table 表名称 deallocateunused keep 0; 注意如果不加keep 0的话,表空间是不会释放的 
      

  4.   

    alter table test2 enable row movement;
    alter table test2 shrink space;
      

  5.   

    差不多算解决了,了解下高水位的问题,对于高水位的具体值是指user_segments里表的bolcks值还是user_tables里的bolcks值?
      

  6.   


    网上看了资料又发现问题,说是shrink 之后,表对应的对象都会实效,
    注意:alter table XXX enable row movement语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。
    想请教下utlrp.sql  是个啥玩意????????
      

  7.   

    dba_free_space 有剩余就可被重用
      

  8.   

    方法1。直接truncate表
    方法2.delete表之后在根据当前表空间大小,重新设置表空间的大小
      

  9.   

    truncate 我知道,那是整表删除,我用delete是加约束条件的,整表删不是找死吗
      

  10.   

    select num_rows,blocks,empty_blocks from user_tables where table_name='A'NUM_ROWS   BLOCKS     EMPTY_BLOCKS---------- ---------- ------------1          5          3  BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块.
      

  11.   

    分段提交如何?
    http://netfire.name/archives/20061031/260.html