oracle数据库表空间不够,想根据delete 加约束条件删除部分数据,但是大家都知道delete不会释放表空间,请问有什么好的方法么?导入导出的感觉不太实际,一是数据太大,二是系统也在实时跑的,肯定有影响。delete操作我已经在做了,就几百万几百万的删记录,但是空间不释放的。

解决方案 »

  1.   

    1,分批删除提交
    2,做表压缩
    3,切换日志
    4,整表或按分区删除,不要用delete,用truncate
      

  2.   


    -- 10g 以后,可以收缩表 ,注意:在收缩完后,手动收集一下统计信息
    -- 给你写个收缩表的例子 
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
    Connected as oracle@ORALABSQL> 
    SQL> create table test(id int, name char(1000)) ;
    Table created
    SQL> insert into test select rownum, rownum from dual connect by rownum <= 10000 ;
    10000 rows inserted
    SQL> -- 表的初始大小
    SQL> select bytes / 1024 / 1024 from user_segments where segment_name = 'TEST' ;
    BYTES/1024/1024
    ---------------
                 12
    SQL> -- 删除数据后,表的大小
    SQL> delete test where mod(id,5) > 1 ;
    6000 rows deleted
    SQL> select bytes / 1024 / 1024 from user_segments where segment_name = 'TEST' ;
    BYTES/1024/1024
    ---------------
                 12
    SQL> alter table test enable row movement ;
    Table altered
    SQL> alter table test shrink space ;
    Table altered
    SQL> -- 收缩表后,表的大小
    SQL> select bytes / 1024 / 1024 from user_segments where segment_name = 'TEST' ;
    BYTES/1024/1024
    ---------------
              4.625
    SQL> drop table test purge ;
    Table droppedSQL> 
      

  3.   

    delete是不会动高水位线的   3楼给了你方法
    但是作为生产库  你这种方式是不可能长久的   
    加盘吧