不是搞数据库的,项目中遇到这个疑问,公司用的是9i,请高手帮忙。

解决方案 »

  1.   

    alter table tablename deallocate unused keep xxxk;alter table move
      

  2.   

    1楼的专家,我在pl-sql里执行过你给我的两条语句了,好像没变化啊。能详细点吗?谢谢~
      

  3.   

    楼主是想降低HWM吗?
    SQL> select owner,segment_name,bytes,blocks,extents from dba_segments
    where segment_name = 'EMP';
    SQL> alter table emp enable row movement;
    SQL> alter table emp shrink space;
    SQL> select owner,segment_name,bytes,blocks,extents from dba_segments
    where segment_name = 'EMP';
      

  4.   

    oracle delete之后的空间并不会被马上收回,这里存在一个hwm(高水位标记)的概念;
    如果希望回收利用数据量较少,但占用空间较多的空间,目前为止应该有两种方式可以实现;
    1,move table
      通过移动表的存储位置,重组所有的数据存储达到回收空间的目的;这个在执行过程中会对对应table对象的性能产生较大影响;并且在执行完成后所有的索引将会失效;需要重建;
    2,在线重定义表
      

  5.   

    3楼的“alter table emp shrink space; ”这句好像是9i以上版本才支持的吧,我用的是9i啊。4楼的两种方法,其中第2条太麻烦了,还要重新导数据吧?还是加个字段,再把这个字段删除?对于第一种方法我上午是过了,好像也不行。
    比如:delete table_name where rownum<=100;
         alter table table_name move.
    也试过了,没啥反应!
      

  6.   

    http://blog.csdn.net/inthirties/archive/2009/09/09/4531986.aspx
      

  7.   

    alter table tb/*恢复的表名*/ enable row movement;
    flashback table tb to timestamp to_timestamp('时间','yyyy-mm-dd hh24:mi:ss');
    --时间是指你在删除表记录的时间的前面某个时间。
      

  8.   

    对alter table emp shrink space是Oracle 10g新增功能,再执行该指令之前必须允许行移动 alter table table_name enable row movement;9i楼主可以试下online redefinition  或者expdp/impdp或exp/imp + truncate
    网上有比较多的解答
    需要注意的是:不管是使用alter table ..move 还是使用online redefinition,都需要额外的空间所以你用truncate吧呵呵。
      

  9.   

    补充一点:move之後,表的rowid将被改变,索引也需要重新构建
      

  10.   


    重建索引不是问题,我也知道可以用导入导出的办法来实现,truncate虽然能够降低HWM,但是是将数据全部清空了啊,我只想删除其中一小部分的数据。效率也是问题啊。关键还是9i,而且我的硬盘空间没有那么大再素质一份好像没有很好的解决方案哦。