表a有1000完條記錄,使用TS_A 表空間,查看表a占用TS_A的容量為1G,而TS_A的容量為1.3G
現在刪除了700萬(wàn)條記錄,COMMIT后查看表a占用TS_A的容量仍然為1G,而且TS_A的容量還是1。3G,請問(wèn)有什么方法可以使這兩個(gè)空間釋放出來(lái)???謝謝!!!!!!!!!1
seraphim 回復于:2003-08-26 18:32:43
EXP,然后DROP原有的數據文件,再創(chuàng )建,然后重新IMP
westapple 回復于:2003-08-26 18:33:09
下面這段可以用來(lái)查某個(gè)用戶(hù)的空間使用情況,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
注意,此代碼需要根據實(shí)際情況修改。
下面語(yǔ)句可以用來(lái)釋放未釋放的空間:
ALTER [ TABLE | INDEX | CLUSTER ] segment_name DEALLOCATE UNUSED;
至于表空間的大小是在創(chuàng )建表空間時(shí)根據數據文件的大小確定的,其大小不會(huì )因為表空間內數據的多少而改變。
表空間的大?。綄儆谠摫砜臻g的的數據文件的空間占用之和。
westapple 回復于:2003-08-26 18:37:25
seraphim ,你也來(lái)了。 :D
seraphim 回復于:2003-08-26 19:12:23
引用:原帖由 "westapple"]seraphim ,你也來(lái)了。 :D
發(fā)表:
:D :D
沒(méi)事兒上來(lái)看看
lojn 回復于:2003-08-26 20:02:08
用 alter table move ...
sam2 回復于:2003-08-27 10:13:28
不行啊,各位大蝦,
表a存儲運營(yíng)數據,不能DROP,
我也試了 ALTER a DEALLOCATE UNUSED,然后查看,兩個(gè)空間都還是沒(méi)變啊,大哥,請幫幫忙,急啊!!!!!!!!!!!!!!!!!!
0_0 回復于:2003-08-27 10:30:25
1.Alter table table_name move tablespace tbsname
2.Exp后刪除表再I(mǎi)mp
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
那種方法管用啊,我也想知道結果,這么多說(shuō)法不知道那個(gè)是精彩回復!呵呵
sanow 回復于:2003-08-27 14:00:36
建立新的表空間new_tablespace
.Alter table table_name move tablespace new_tablespace
這樣就已經(jīng)整理了碎片。不必在再什么EXP,IMP了。
rollingpig 回復于:2003-08-27 15:34:48
引用:原帖由 "txfy"]那種方法管用啊,我也想知道結果,這么多說(shuō)法不知道那個(gè)是精彩回復!呵呵
發(fā)表:
呵呵
alter table …… move tablespace
sam2 回復于:2003-08-27 15:40:47
首先謝謝各位大蝦,經(jīng)過(guò)測試,我發(fā)現在刪除數據后,表占用表空間是不變的,但當再insert 相同條數的數據(被刪除的數據),再查看,表占用表空間還
是和INSERT前那么多,但再I(mǎi)NSERT時(shí),空間就會(huì )增加了,該怎么解釋呢?
是不是其實(shí)刪除數據后空間是發(fā)生變化了,或打上了標記位,當下一次INSERT時(shí)就覆蓋該標志位的數據段,那么就相當于釋放了被刪除的數據 ??
sam2 回復于:2003-08-27 15:43:45
alter table …… move tablespace 是可以看到釋放了空間,但這樣把表空間改來(lái)改去,萬(wàn)一ALTER的過(guò)程發(fā)生錯誤,那就很恐怖了,所以不敢試
psb_天涯浪子 回復于:2003-08-27 15:47:58
好像刪除一個(gè)表的數據后,原存放該數據的空間不提供給同一表空間內的其他表使用,但此表在插入數據的時(shí)候也仍然可以使用釋放出來(lái)的空間。
引用:原帖由 "sam2" 發(fā)表:
首先謝謝各位大蝦,經(jīng)過(guò)測試,我發(fā)現在刪除數據后,表占用表空間是不變的,但當再insert 相同條數的數據(被刪除的數據),再查看,表占用表空間還
是和INSERT前那么多,但再I(mǎi)NSERT時(shí),空間就會(huì )增加了,該怎么解釋呢..........
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;
-- 下面建表的這句話(huà),主要為了達到一個(gè)目的,就是創(chuàng )建一個(gè)跟a表完全相同的孔表,因此不一定要這么寫(xiě)。
create table a as select * from a_bak where 1=2;
--將備份表的數據插回新創(chuàng )建的表。
insert into a select * from a_bak;
--刪除備份表。
drop table a_bak;
:em02: :em02:
原文鏈接:
http://bbs.chinaunix.net/viewthread.php?tid=147774轉載請注明作者名及原文出處