如果表A,B...等十多个表中均有20~100万条左右的数据,全部数据库有100多张表,因为经常用delete删除数据时,高水位没有释放,导致全表扫描慢,占用表空间等。
看网上说为了彻底释放表空间,要用exp/imp等导入导出工具将数据导出再导入,然后我现在是用,
create table A_BAK as select * from A,然后再
truncate table A;
insert into A select * from A_BAK;
drop A_BAK;
purge recyclebin;
不知道这样是否能彻底释放?
另外insert into A select * from A_BAK;好像比先drop掉A,再
create table A as select * from A_BAK还要慢啊,
直接插大量数据好像很慢,为什么直接建表插还快一些啊?
看网上说为了彻底释放表空间,要用exp/imp等导入导出工具将数据导出再导入,然后我现在是用,
create table A_BAK as select * from A,然后再
truncate table A;
insert into A select * from A_BAK;
drop A_BAK;
purge recyclebin;
不知道这样是否能彻底释放?
另外insert into A select * from A_BAK;好像比先drop掉A,再
create table A as select * from A_BAK还要慢啊,
直接插大量数据好像很慢,为什么直接建表插还快一些啊?
谢谢
truncate table A;
insert into A select * from A_BAK;
drop A_BAK;
purge recyclebin; 这里为什么不用rename 把 A_BAK 改回 A?还重新插一遍?多累啊
1.analyze table A compute statistics;
2.create table A_BAK as select * from A;
3.analyze table A_BAK compute statistics;
4.truncate table A;
5.analyze table A compute statistics;
6.create table A as select * from A_BAK;-- 查看表存储空间sql
select owner,table_name,
NUM_ROWS ,
BLOCKS * &db_block_size/1024/1024 "Size M",
EMPTY_BLOCKS,
LAST_ANALYZED from dba_tables where table_name='&table_name';
然后再rename A_BAK to A; //语法忘了,有这个rename表名的语句的汗,
2.drop table A;
3.ALTER TABLE A_BAK RENAME TO A;
4.analyze table A compute statistics;
1.alter table xxx enable row movement;
2.alter table xxx shrink space;
即可。
你有100多表,写个过程就行了。