如果表A,B...等十多个表中均有20~100万条左右的数据,全部数据库有100多张表,因为经常用delete删除数据时,高水位没有释放,导致全表扫描慢,占用表空间等。
看网上说为了彻底释放表空间,要用exp/imp等导入导出工具将数据导出再导入,然后我现在是用,
create table A_BAK as select * from A,然后再
truncate table A;
insert into A select * from A_BAK;
drop A_BAK;
purge recyclebin;
不知道这样是否能彻底释放?
另外insert into A select * from A_BAK;好像比先drop掉A,再
create table A as select * from A_BAK还要慢啊,
直接插大量数据好像很慢,为什么直接建表插还快一些啊?

解决方案 »

  1.   

    数据库Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod
    谢谢
      

  2.   

    create table A_BAK as select * from A,然后再
    truncate table A;
    insert into A select * from A_BAK;
    drop A_BAK;
    purge recyclebin; 这里为什么不用rename 把 A_BAK 改回 A?还重新插一遍?多累啊
      

  3.   

    楼主可以按照以下步骤试试。
    1.analyze table  A  compute statistics;
    2.create table A_BAK as select * from A;
    3.analyze table  A_BAK  compute statistics;
    4.truncate table A; 
    5.analyze table  A  compute statistics;
    6.create table A as select * from A_BAK;-- 查看表存储空间sql
    select owner,table_name, 
    NUM_ROWS , 
    BLOCKS * &db_block_size/1024/1024 "Size M", 
    EMPTY_BLOCKS, 
    LAST_ANALYZED from  dba_tables where table_name='&table_name';
      

  4.   

    drop table A purge???好像这里加个啥关键字就可以释放表空间了
    然后再rename A_BAK to A; //语法忘了,有这个rename表名的语句的汗,
      

  5.   

    1.create table A_BAK as select * from A; 
    2.drop table A;
    3.ALTER TABLE A_BAK RENAME TO A;
    4.analyze table  A compute statistics; 
      

  6.   

    10g的话降低hwm没那么麻烦。
    1.alter table xxx enable row movement;
    2.alter table xxx shrink space;
    即可。
    你有100多表,写个过程就行了。