oracle truncate表空间释放问题的解决办法
时间:2010-10-12 来源:zhongtang
    1.删除表中所有的行,释放数据所占用的自由空间;
    同时删除索引数据,释放该表上的index所占用的自由空间。
    TRUNCATE TABLE employees_demo;
  
    但是,但是,truncate不会释放由 MINEXTENTS storage parameter指定的存储参数。
    
    例如下表,即便没有任何记录,也会占用3G空间,索引占用1.7G空间:
    -- Create table
    create table SYS_SCT_USERLOG
    (
      id          NUMBER not null,
      splog2      VARCHAR2(200)
    )
    tablespace USERS
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 3072M
        minextents 1
        maxextents unlimited
      );
    -- Create/Recreate primary, unique and foreign key constraints
    alter table SYS_SCT_USERLOG
      add constraint PK_SYS_SCT_USERLOG primary key (ID)
      using index
      tablespace USERS
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 1092M
        minextents 1
        maxextents unlimited
      );
    
    2.删除表中所有的行,保留表所占用的空间,留待该表下次使用。
    TRUNCATE CLUSTER personnel REUSE STORAGE;
    
    3.删除表中所有的行,不删除物理视图中数据。
    TRUNCATE TABLE sales_demo PRESERVE MATERIALIZED VIEW LOG;
    
    二、解决办法
    1.执行以下语句
    alter TABLE SYS_SCT_USERLOG deallocate unused keep 1k ;
    alter index PK_SYS_SCT_USERLOG deallocate unused keep 1k ;
  
    2.如果大批量truncate表,如何解决?
    
    Select owner, decode(partition_name,
                  null,
                  segment_name,
                  segment_name || ':' || partition_name) objectname ,
           'alter ' || segment_type || ' ' ||
           decode(partition_name,
                  null,
                  segment_name,
                  segment_name || ':' || partition_name) ||
           ' deallocate unused keep 1k  ' scripts,
           segment_type objecttype,
           nvl(bytes, 0) "SIZE",
           nvl(initial_extent, 0) INITIALEXT,
           nvl(next_extent, 0) NEXTEXT,
           nvl(extents, 0) NUMEXTENTS,
           nvl(max_extents, 0) "MAXEXTENTS"
      from dba_segments
     where tablespace_name =  'USERS'
     and owner = 'SINOSYNEW'
     and objecttype in ('TABLE','INDEX')
     order by  nvl(bytes, 0) desc  ;
  
    拷贝执行结果中第三列数据得到批量语句如下;
    alter TABLE FIN_AR_REMAIN_BILL deallocate unused keep 1k ;
    alter TABLE FIN_WARE_LIST deallocate unused keep 1k ;
    alter INDEX PK_WMS_INOUT_LOT_HISTORY deallocate unused keep 1k ;
  
……
    <--- end --->
  










