Oracle表段中高水位線HWM

lwitpub發表於2009-09-17

在Oracle資料的儲存中,可以把儲存空間想象為一個水庫,資料想象為水庫中的水。水庫中的水的位置有一條線叫做水位線,在Oracle中,這條線被稱為高水位線(High-warter mark, HWM)。在表剛建立的時候,由於沒有任何資料,所以這個時候水位線是空的,也就是說HWM為最低值。當插入了資料以後,高水位線就會上漲,但是這裡也有一個特性,就是如果你採用delete語句刪除資料的話,資料雖然被刪除了,但是高水位線卻沒有降低,還是你剛才刪除資料以前那麼高的水位。也就是說,這條高水位線在日常的增刪操作中只會上漲,不會下跌。

那有沒有辦法讓高水位線下降呢,其實有一種比較簡單的方法,那就是採用TRUNCATE語句進行刪除資料。採用TRUNCATE語句刪除一個表的資料的時候,類似於重新建立了表,不僅把資料都刪除了,還把HWM給清空恢復為0。所以如果需要把表清空,在有可能利用TRUNCATE語句來刪除資料的時候就利用TRUNCATE語句來刪除表,特別是那種資料量有可能很大的臨時儲存表。

如果在執行刪除操作後不降低高水位線標記或不回收使用空間,則將導致查詢語句的效能低下。下面的方法都可以降低高水位線標記。

1.執行alter table  table_name shrink space cascade; 此命令為Oracle10g新增功能,再執行該指令之前必須允許行移動alter table   table_name  enable row movement;假設表t_lob如下:

SQL> alter table t_lob enable row movement;

Table altered.

SQL> alter table t_lob shrink space cascade;

Table altered.
2.複製要保留的資料到臨時表t,drop原表,然後rename臨時表t為原表
3.emp/imp
4.alter  table  table_name  deallocate  unused;
5.儘量truncate 將會省去很多麻煩。

而如果表中有LOB欄位時,也可以做嗎?答案是肯定的.可以透過兩種方法來做.一種是透過普通的alter table  table_name  shrink space cascade來做(注意一定要有cascade);第二種是透過alter  table  table_name  modify lob(column)  (shrink space)來做,但這樣只回收LOB欄位使用空間,不回收表的使用空間.只有對錶alter table  t_lob shrink space 才能回收表空間。可以透過select segment_name,segment_type,bytes/1024,tablespace_name from user_segments;語句查詢段LOBSEGMENT和表t_lob的大小變化。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/628922/viewspace-614866/,如需轉載,請註明出處,否則將追究法律責任。

相關文章