一个很大的表删除记录后没有回收空间

imfjl 2003-12-08 01:52:15
一个很大的表记录了很多记录,发现表的容量不断增加.后来删除了表的一部分记录,却发现表所占的空间并没有回收起来,是什么原因呢?我用下面的语句查看表所占的空间的:
select segment_name,sum(bytes),count(*) ext_quan from dba_extents where
tablespace_name='SYSTEM' and segment_type='TABLE' group by tablespace_name,segment_name having sum(bytes)>500000000;
...全文
50 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
menglj 2003-12-16
清理这个表的无用数据,把这个表用exp导出,drop这个表,alter tablespace [name] coalesce,再imp这个表。
回复
imfjl 2003-12-08
ALTER [ TABLE | INDEX | CLUSTER ] segment_name DEALLOCATE UNUSED;
有用吗?有人说这是HWM(high water mark)问题,到底怎么办呢?
回复
sanoul 2003-12-08
CREATE TABLE NEWNAME AS SELECT * FROM OLDNAME;
TRUNCATE TABLE OLDNAME;
INSERT INTO OLDNAME SELECT * FROM NEWNAME;
DROP TABLE NEWNAME;
回复
imfjl 2003-12-08
可是我现在硬盘的空间不足够让我进行这样的一种操作啊.我需要从原来的表先释放出空间后才能做这样的事情!哪道就没有一种办法可以直接对表进行回收的吗??
回复
LGQDUCKY 2003-12-08
用truncate table 表名。
这样的方法不如从新建立表,这样可以从新分配存储的参数。
回复
qiyousyc 2003-12-08
用truncate table 表名。
这样会回收空间并且速度很快。
回复
sanoul 2003-12-08
对,delete本身只是把数据和表之间断开联系,其物理盘片上仍旧保存着数据,你可以采用truncate table来删除数据。

至于表空间你可以在init.ora里面设置pctincrease=0来清理碎片增长量。
回复
ruyuezhang 2003-12-08
delete并不释放空间。
如果变动很大的话,可以先根据原来的表创建一个新表,truncate掉原来的表,再把新表rename 回去。
create tablea as
select * from tableb;

回复
相关推荐
发帖
基础和管理
创建于2007-09-28

1.7w+

社区成员

Oracle 基础和管理
申请成为版主
帖子事件
创建了帖子
2003-12-08 01:52
社区公告
暂无公告