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 --->