擔心LOG產生太大時,先修改TABLE為NOLOGGING模式:
alter table t1 nologging;
當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 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' ;