关于一个表的空间回收的问题。

ygqzd 2003-07-11 03:24:34
我们系统中有一个用于交换的表,最初考虑这个表最多只能容纳100万人
的照片信息(出于系统容量的限制),其它系统把数据添加到这个表中,我们来取得这些数据。
现在的问题是这些数据是分批添加的,我们也是分批接收的。
我们接收完一批之后,这批数据就没有用了,就可以删除了。
但是据说 delete 语句只是把数据删除了,并没有真正回收空间,只能用 truncate table 语句才可以回收空间。可是truncate是全表删除,我们不能这样做,因为表中还有未接收的数据。

请教各位高手在技术上有好的办法吗?能够实现我的上述要求。
先谢谢了。
...全文
38 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ygqzd 2003-07-14
  • 打赏
  • 举报
回复
多谢各位,准备使用黄山兄弟的alter table move tablespaces 试试。
多谢各位,开始加分了。
woodpan 2003-07-13
  • 打赏
  • 举报
回复
学习一下,请问
create table tab
nologging parallel
as select * from temp;
是不是只是9i才开始支持?这样的语句和
create table tab
insert into tab as select * from temp比效率有多大的提高?
另:
如果作过图片数据导入导出的话,就会知道几十万包括图片的数据的操作是非常耗时的,楼上的简单的用中间表和exp/imp的方法都是不可接受的,因为这样做的后果很可能是数据库24小时光做这件事了


skyxj 2003-07-13
  • 打赏
  • 举报
回复
实际上你将这个表导出来很慢,oracle数据库中仍然有很多碎片,你如果试图将表空间缩小到实际使用空间大小,将发现不能缩小的ora错误。可以使用
alter table move tablespaces
alter index rebuild tablespaces
转移到别的表空间,将表空间回收。
wxdsun 2003-07-12
  • 打赏
  • 举报
回复
同意 radish() 做法,
alter table move
如果有index 还要alter index rebuild
gladness 2003-07-11
  • 打赏
  • 举报
回复
同意一品黄山兄的第一个方案,如果是增加一批删一批,那么也不会无限地长大,这样最方便,而且也不需要做一些很耗资源的工作。
radish 2003-07-11
  • 打赏
  • 举报
回复
用alter table move alter index rebuild
sun9989 2003-07-11
  • 打赏
  • 举报
回复
1、其实单独放在一表空间里就可以了,管它呢!
2、alter table tab move.......真好重整空间了。
3、alter table tab rename to temp;
create table tab
nologging parallel
as select * from temp;
drop table temp;

hrb_qiuyb 2003-07-11
  • 打赏
  • 举报
回复
可以用一下DragonPsyche的方法
标准有做法应该是这样的
1、以compress=y选项导出表
exp username/password tables=table1 compress=y file=table1.dmp
2、sql>truncate table1
3、导入表
imp username/password file=table1.dmp ignore=y tables=table1
ygqzd 2003-07-11
  • 打赏
  • 举报
回复
使用临时表的方法确实可以解决这个问题。

可是TableA的记录可能会有几十万的数据,并且还包含BLOB字段。

create table tableB as select * from tableA;
会不会非常慢?

还有什么好方法吗?多谢热心肠的兄弟。
天桥半仙儿 2003-07-11
  • 打赏
  • 举报
回复
同意楼上,在执行操作前建议disable trigger 和 index 和check
DragonPsyche 2003-07-11
  • 打赏
  • 举报
回复
原始表tableA
临时表tableB

方法描述:
create table tableB as select * from tableA;
truncate table tableA;
insert into tableA select * from tableB;
drop table tableB;

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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