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

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;
...全文
83 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
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;

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧