我们系统中有一个用于交换的表,最初考虑这个表最多只能容纳100万人
的照片信息(出于系统容量的限制),其它系统把数据添加到这个表中,我们来取得这些数据。
现在的问题是这些数据是分批添加的,我们也是分批接收的。
我们接收完一批之后,这批数据就没有用了,就可以删除了。
但是据说 delete 语句只是把数据删除了,并没有真正回收空间,只能用 truncate table 语句才可以回收空间。可是truncate是全表删除,我们不能这样做,因为表中还有未接收的数据。请教各位高手在技术上有好的办法吗?能够实现我的上述要求。
先谢谢了。

解决方案 »

  1.   

    原始表tableA
    临时表tableB方法描述:
    create table tableB as select * from tableA;
    truncate table tableA;
    insert into tableA select * from tableB;
    drop table tableB;
      

  2.   

    同意楼上,在执行操作前建议disable trigger 和 index 和check
      

  3.   

    使用临时表的方法确实可以解决这个问题。可是TableA的记录可能会有几十万的数据,并且还包含BLOB字段。create table tableB as select * from tableA;
    会不会非常慢?还有什么好方法吗?多谢热心肠的兄弟。
      

  4.   

    可以用一下DragonPsyche的方法
    标准有做法应该是这样的
    1、以compress=y选项导出表
      exp username/password tables=table1 compress=y file=table1.dmp
    2、sql>truncate table1
    3、导入表
      imp username/password file=table1.dmp ignore=y tables=table1
      

  5.   

    1、其实单独放在一表空间里就可以了,管它呢!
    2、alter table tab move.......真好重整空间了。
    3、alter table tab rename to temp;
       create table tab
       nologging parallel
       as select * from temp;
       drop table temp;
      

  6.   

    用alter table move alter index rebuild
      

  7.   

    同意 radish()  做法,
    alter table move 
    如果有index 还要alter index rebuild
      

  8.   

    学习一下,请问
    create table tab
       nologging parallel
       as select * from temp;
    是不是只是9i才开始支持?这样的语句和
    create table tab
    insert into tab as select * from temp比效率有多大的提高?
    另:
    如果作过图片数据导入导出的话,就会知道几十万包括图片的数据的操作是非常耗时的,楼上的简单的用中间表和exp/imp的方法都是不可接受的,因为这样做的后果很可能是数据库24小时光做这件事了 
      

  9.   

    实际上你将这个表导出来很慢,oracle数据库中仍然有很多碎片,你如果试图将表空间缩小到实际使用空间大小,将发现不能缩小的ora错误。可以使用
    alter table move tablespaces
    alter index rebuild tablespaces
    转移到别的表空间,将表空间回收。
      

  10.   

    多谢各位,准备使用黄山兄弟的alter table move tablespaces 试试。
    多谢各位,开始加分了。