各位大侠:
 表空间TS_TABLESPACE1 中存储了表: t1, t2, ... t20 。 
 表空间TS_TABLESPACE1的大小是500MByte.  经过alter table t1/t2/t3/..t15 move tablespace TS_TABLESPACE2后, 表空间TS_TABLESPACE2的大小变大了,
 但是TS_TABLESPACE1 并没有随着表t1..t15的转移而变小, 这是为什么呢? 
 如果我需要把TS_TABLESPACE1变小而又不会丢失数据,该怎么办呢? 
 
谢谢。

解决方案 »

  1.   

    你move了表,但是在tablespace1中的高水位线没有降低,数据库没有释放出来哦
    可以用命令:alter database datafile '...' resize ... 把tablespace1中的数据为空的数据块剔除掉!
      

  2.   

    其实就好比你DELETE 删除了某条数据一样.它只是把它放在临时区域(内存中),并没有真正的删除.只有当你COMMIT了后,才删除.MOVE TBALE 并没有删除表在它在原来的空间里.用DROP不但快.还干净/
      

  3.   


    1. 那些表不是移到另外的表空间了吗? 
       怎么“truncate移走的那些表 ” 或者“drop 掉移走的那些表呢?”
    2. “ alter database datafile '...' resize ... 把tablespace1中的数据为空的数据块剔除掉! ”
       我该怎么判断tablespace1中数据为空的数据块?感谢各位 !
      

  4.   

    你的问题是不恰当的。 不存在“truncate移走的那些表 ” 或者“drop 掉移走的那些表,
    也用不着你自己来判断空的数据块(如果到了那个地步,数据库还怎么维护)。1)EXECUTE dbms_stats.gather_schema_stats('TEST');
    2)select bytes/1024/1024  free_size from dba_data_files where tablespace_name='TEST'; 
      获得空闲空间
    3)select  SUM(BYTES/1024/1024) total_size from dba_free_space where tablespace_name='TEST';
      获得共有空间4)然后吧共有空间-空闲空间 就是实际应该占有的空间,
    alter database datafile 'd:\...' resize xM  ;
      这里x=total_size-free_size;如果文件比较多应该注意按照文件处理.