當Oracle 建置一個segment 的時候,會藉由HWM (Hight Water Mark)指標來記錄segment 內,有哪些blocks 是被使用過的

HWM 就像一個分屆點,一邊代表使用過的blocks,另一邊則是尚未被使用的blocks.
HWM有一個特性,就是只會向尚未使用的blocks 方向移動,也就是說當資料不斷被insert 時,HWM會不斷向尚未使用blocks 方向移動,但當資料被delete 後,雖然有儲存資料的blocks 已經減少,並不會讓HWM向反方向移動, 要注意的是當insert 失敗也是會讓HWM移動,即使失敗後rollback 也不會讓HWM向下降

HWM以下如果存有太多空的blocks, 除了浪費空間之外,最明顯的缺點就是當Full Table Scan 時產生不必要的I/O, 因為Oracle 進行Full Table Scan 時,會讀取HWM以下的blocks

要調整HWM可以藉由下面的指令達成

1. export / import
2. alter table table_name move;
3. alter index index_table rebuild online;
4. alter table table_name shrink space ; (only for Oracle 10g)

alter table XX move 使用table lock , alter table XX shrink space 使用row lock


Shrink Space Syntax

shrink space 的兩個必要條件
1. Enable row movement
2. Table 所在的tablespace 不能使用在segment space management manaual 的tablespace, 必須為auto

執行shrink space 分成兩個階段
1. compact : 透過insert / delete 將資料盡量排例在segment 前面.這個階段會造成rowid的改變,因此需要enable row movement.

alter table TABLE_NAME enable row movement;

2. HWM 調整:這個階段是調整HWM位置,釋放表格空間

alter table <TABLE_NAME> shrink space compact ; 只會執行第一階段
alter table <TABLE_NAME> shrink space ; 兩個階段都會執行
alter table <TABLE_NAME> shrink space cascade ; 同時處理相關index 空間
alter index <INDEX_NAME> shrink space ; 回收index 空間
alter table <TABLE_NAME> modify lob (<lob_clomun>) (shrink space);

由於alter table TABLE_NAME enable row movement 可能會使的引用該table的object( ex procedure,package,view...) 變成invalid,所以執行後最後執行一下utlrp.sql 或 utlprp.sql 來編譯一下invalid object , utlrp.sql 或 utlprp.sql放在$ORACLE_HOME/rdbms/admin 目錄下,或者執行UTL_RECOMP這個package


Shrink space script

1. Normal Table

select'alter table '|| owner || '.' || table_name||' enable row movement;
'||chr(10)||'alter table '|| owner || '.'||table_name||' shrink space;'||chr(10)
from  dba_tables;

select'alter index '|| owner || '.' ||index_name||' shrink space;'||chr(10)<
from dba_indexes;

2. Partition Table

select 'alter table '|| owner || '.'  ||table_name||' enable row movement;'||chr(10)||
'alter table '|| owner || '.'||table_name||' shrink space;'||chr(10) from dba_tables 

select 'alter index '|| owner || '.'||index_name||' shrink space;'||chr(10)
from dba_indexes where uniqueness='NONUNIQUE' ;

select 'alter table '|| owner || '.'||segment_name||' modify subpartition '||partition_name||' shrink space;'||chr(10) 
from dba_segments where segment_type='TABLE SUBPARTITION' ;

Reference

http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/schema.htm#sthref2096

http://www.idevelopment.info/data/Oracle/DBA_tips/LOBs/LOBS_85.shtml

http://www.oracle-base.com/articles/misc/RecompilingInvalidSchemaObjects.php#utlrp_and_utlprp

arrow
arrow
    文章標籤
    [學習筆記][Oracle]Database
    全站熱搜

    rickyju 發表在 痞客邦 留言(0) 人氣()