我们系统中有一个用于交换的表,最初考虑这个表最多只能容纳100万人
的照片信息(出于系统容量的限制),其它系统把数据添加到这个表中,我们来取得这些数据。
现在的问题是这些数据是分批添加的,我们也是分批接收的。
我们接收完一批之后,这批数据就没有用了,就可以删除了。
但是据说 delete 语句只是把数据删除了,并没有真正回收空间,只能用 truncate table 语句才可以回收空间。可是truncate是全表删除,我们不能这样做,因为表中还有未接收的数据。请教各位高手在技术上有好的办法吗?能够实现我的上述要求。
先谢谢了。
的照片信息(出于系统容量的限制),其它系统把数据添加到这个表中,我们来取得这些数据。
现在的问题是这些数据是分批添加的,我们也是分批接收的。
我们接收完一批之后,这批数据就没有用了,就可以删除了。
但是据说 delete 语句只是把数据删除了,并没有真正回收空间,只能用 truncate table 语句才可以回收空间。可是truncate是全表删除,我们不能这样做,因为表中还有未接收的数据。请教各位高手在技术上有好的办法吗?能够实现我的上述要求。
先谢谢了。
解决方案 »
- 关于Process J000 is dead 错误
- sqlserver的bit类型在oracle中可以用什么类型表示
- oracle 数据库迁移
- 关于Oracle中JOB的问题~~~
- 请问oracle数据库有90万,用where删除最快方法
- 如何确定一个导出的dmp文件的字符集??
- 两个数据库(Oracle9和SQL Server2000)
- 请问谁有oracle xml db相关的中文资料,我到google上搜了一下,但数量有限。
- 请问哪里Oracle 8i for Windows 2000 下载,119!信用卡结帐。
- 如何手工创建Oracle9i数据库!!
- 权限resource与quotas的关系??
- oracle中blob类型放什么数据
临时表tableB方法描述:
create table tableB as select * from tableA;
truncate table tableA;
insert into tableA select * from tableB;
drop table tableB;
会不会非常慢?还有什么好方法吗?多谢热心肠的兄弟。
标准有做法应该是这样的
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
2、alter table tab move.......真好重整空间了。
3、alter table tab rename to temp;
create table tab
nologging parallel
as select * from temp;
drop table temp;
alter table move
如果有index 还要alter index rebuild
create table tab
nologging parallel
as select * from temp;
是不是只是9i才开始支持?这样的语句和
create table tab
insert into tab as select * from temp比效率有多大的提高?
另:
如果作过图片数据导入导出的话,就会知道几十万包括图片的数据的操作是非常耗时的,楼上的简单的用中间表和exp/imp的方法都是不可接受的,因为这样做的后果很可能是数据库24小时光做这件事了
alter table move tablespaces
alter index rebuild tablespaces
转移到别的表空间,将表空间回收。
多谢各位,开始加分了。