[精彩] 急,请教oralce 删除记录后空间释放问题

来源:百度文库 编辑:神马文学网 时间:2024/04/27 15:24:55
表a有1000完条记录,使用TS_A 表空间,查看表a占用TS_A的容量为1G,而TS_A的容量为1.3G
现在删除了700万条记录,COMMIT后查看表a占用TS_A的容量仍然为1G,而且TS_A的容量还是1。3G,请问有什么方法可以使这两个空间释放出来???谢谢!!!!!!!!!1
seraphim 回复于:2003-08-26 18:32:43
EXP,然后DROP原有的数据文件,再创建,然后重新IMP
westapple 回复于:2003-08-26 18:33:09
下面这段可以用来查某个用户的空间使用情况,try it
The following is a simple SQL*Plus report on space utilization by tables in the current session schema. It displays total space allocated, total unused space, and the percentage of allocated space that is unused.
DECLARE
total_blocks  NUMBER;
total_bytes   NUMBER;
unused_blocks NUMBER;
unused_bytes  NUMBER;
last_extent_file  NUMBER;
last_extent_block NUMBER;
last_block    NUMBER;
grand_total_blocks NUMBER := 0;
grand_total_unused NUMBER := 0;
BEGIN
FOR user_tables_rec IN
(SELECT table_name
FROM user_tables)
LOOP
DBMS_SPACE.UNUSED_SPACE
(segment_owner =>; USER
,segment_name  =>; user_tables_rec.table_name
,segment_type  =>; ‘TABLE‘
,total_blocks  =>; total_blocks
,total_bytes   =>; total_bytes
,unused_blocks =>; unused_blocks
,unused_bytes  =>; unused_bytes
,last_used_extent_file_id =>; last_extent_file
,last_used_extent_block_id =>; last_extent_block
,last_used_block  =>; last_block
);
grand_total_blocks := grand_total_blocks + total_blocks;
grand_total_unused := grand_total_unused + unused_blocks;
END LOOP;
DBMS_OUTPUT.PUT_LINE(‘Space utilization (TABLES) ‘);
DBMS_OUTPUT.PUT_LINE(‘total blocks: ‘||
TO_CHAR(grand_total_blocks) );
DBMS_OUTPUT.PUT_LINE(‘unused blocks: ‘||
TO_CHAR(grand_total_unused) );
DBMS_OUTPUT.PUT_LINE(‘pct unused: ‘||
TO_CHAR(ROUND((grand_total_unused/grand_total_blocks)*100) ) );
END;
/
This is a sample of the report output:
Space utilization (TABLES)
total blocks: 1237
unused blocks: 613
pct unused: 50
注意,此代码需要根据实际情况修改。
下面语句可以用来释放未释放的空间:
ALTER [ TABLE | INDEX | CLUSTER ] segment_name DEALLOCATE UNUSED;
至于表空间的大小是在创建表空间时根据数据文件的大小确定的,其大小不会因为表空间内数据的多少而改变。
表空间的大小=属于该表空间的的数据文件的空间占用之和。
westapple 回复于:2003-08-26 18:37:25
seraphim ,你也来了。      :D
seraphim 回复于:2003-08-26 19:12:23
引用:原帖由 "westapple"]seraphim ,你也来了。      :D
发表:
:D  :D
没事儿上来看看
lojn 回复于:2003-08-26 20:02:08
用 alter table move ...
sam2 回复于:2003-08-27 10:13:28
不行啊,各位大虾,
表a存储运营数据,不能DROP,
我也试了 ALTER a DEALLOCATE UNUSED,然后查看,两个空间都还是没变啊,大哥,请帮帮忙,急啊!!!!!!!!!!!!!!!!!!
0_0 回复于:2003-08-27 10:30:25
1.Alter table table_name move tablespace tbsname
2.Exp后删除表再Imp
Taylorgao 回复于:2003-08-27 12:32:30
create table t_tmp as select * from a;
truncate table a;
insert into a select * from t_tmp
txfy 回复于:2003-08-27 13:15:22
那种方法管用啊,我也想知道结果,这么多说法不知道那个是精彩回复!呵呵
sanow 回复于:2003-08-27 14:00:36
建立新的表空间new_tablespace
.Alter table table_name move tablespace new_tablespace
这样就已经整理了碎片。不必在再什么EXP,IMP了。
rollingpig 回复于:2003-08-27 15:34:48
引用:原帖由 "txfy"]那种方法管用啊,我也想知道结果,这么多说法不知道那个是精彩回复!呵呵
发表:
呵呵
alter table …… move tablespace
sam2 回复于:2003-08-27 15:40:47
首先谢谢各位大虾,经过测试,我发现在删除数据后,表占用表空间是不变的,但当再insert 相同条数的数据(被删除的数据),再查看,表占用表空间还
是和INSERT前那么多,但再INSERT时,空间就会增加了,该怎么解释呢?
是不是其实删除数据后空间是发生变化了,或打上了标记位,当下一次INSERT时就覆盖该标志位的数据段,那么就相当于释放了被删除的数据  ??
sam2 回复于:2003-08-27 15:43:45
alter table …… move tablespace  是可以看到释放了空间,但这样把表空间改来改去,万一ALTER的过程发生错误,那就很恐怖了,所以不敢试
psb_天涯浪子 回复于:2003-08-27 15:47:58
好像删除一个表的数据后,原存放该数据的空间不提供给同一表空间内的其他表使用,但此表在插入数据的时候也仍然可以使用释放出来的空间。
引用:原帖由 "sam2" 发表:
首先谢谢各位大虾,经过测试,我发现在删除数据后,表占用表空间是不变的,但当再insert 相同条数的数据(被删除的数据),再查看,表占用表空间还
是和INSERT前那么多,但再INSERT时,空间就会增加了,该怎么解释呢..........
rollingpig 回复于:2003-08-27 16:24:32
呵呵
this is the question about HWM(high water mark)
only truncate/drop/move can reduce it!!
精华区里有这一方面的文章,大家可以看看!!
pigydree 回复于:2004-07-06 09:43:35
用delete删除数据
--先将a表备份。
rename  a  to  a_bak;
-- 下面建表的这句话,主要为了达到一个目的,就是创建一个跟a表完全相同的孔表,因此不一定要这么写。
create table   a    as select * from     a_bak    where 1=2;
--将备份表的数据插回新创建的表。
insert  into   a  select * from a_bak;
--删除备份表。
drop table a_bak;
:em02:  :em02:

原文链接:http://bbs.chinaunix.net/viewthread.php?tid=147774
转载请注明作者名及原文出处