轉載-oracle Shrink命令的使用

wadekobe9發表於2012-04-12

10g開始,oracle開始提供Shrink的命令,假如我們的表空間中支援自動段空間管理  (ASSM),就可以使用這個特性縮小段,即降低HWM

Shrink的兩大功能

1、降低高水位線會使得full  table  scan的效率得以提升

2、回縮資料庫空閒的空間

 

segment  shrink分為兩個階段 

 

1、資料重組(compact):通過一系列insertdelete操作,將資料儘量排列在段的前面。在這個過程中需要在表上加RX鎖,即只在需要移動的行上加鎖。由於涉及到rowid的改變,需要enable  row  movement.同時要disable基於rowidtrigger.這一過程對業務影響比較小。 

 

2HWM調整:第二階段是調整HWM位置,釋放空閒資料塊。此過程需要在表上加X鎖,會造成表上的所有DML語句阻塞。在業務特別繁忙的系統上可能造成比較大的影響。 

 

shrink  space語句兩個階段都執行。                  

shrink  space  compact只執行第一個階段。 

 

如果系統業務比較繁忙,可以先執行shrink  space  compact重組資料,然後在業務不忙的時候再執行shrink  space降低HWM釋放空閒資料塊。 

 

shrink必須開啟行遷移功能。 

alter  table  table_name  enable  row  movement  ; 

 

注意:alter  table  XXX  enable  row  movement語句會造成引用表XXX的物件(如儲存過程、包、檢視等)變為無效。執行完成後,最好執行一下utlrp.sql來編譯無效的物件。 

 

語法: 

alter  table  <table_name>  shrink  space  [    |  compact  |  cascade  ]; 

alter  table  <table_name>  shrink  space  compcat;      

 

收縮表,相當於把塊中資料打結實了,但會保持  high  water  mark; 

 

alter  table  <tablespace_name>  shrink  space; 

收縮表,降低  high  water  mark; 

 

alter  table  <tablespace_name>  shrink  space  cascade; 

收縮表,降低  high  water  mark,並且相關索引也要收縮一下下。 

 

alter  index  idxname  shrink  space; 

 

回縮索引 

 

1:普通表 

Sql指令碼,改指令碼會生成相應的語句 

selectalter  table  ‘||table_name||’  enable  row  movement;’||chr(10)||’alter  table  ‘||table_name||’  shrink  space;’||chr(10)from  user_tables; 

 

selectalter  index  ‘||index_name||’  shrink  space;’||chr(10)from  user_indexes; 

 

注:這裡可以直接通過oem工具,在段的指導建議案裡面得出哪些物件是需要操作的,並且OEM會直接給出SQL.

 

2:分割槽表的處理 

進行shrink  space  發生ORA-10631錯誤.shrink  space有一些限制. 

在表上建有函式索引(包括全文索引)會失敗。 

 

Sql指令碼,改指令碼會生成相應的語句 

select  ‘alter  table  ‘||table_name||’  enable  row  movement;’||chr(10)||’alter  table  ‘||table_name||’  shrink  space;’||chr(10)  from  user_tables  where  ; 

 

select  ‘alter  index  ‘||index_name||’  shrink  space;’||chr(10)  from  user_indexes  where  uniqueness=’NONUNIQUE’  ;        www.2cto.com   

 

select  ‘alter  table  ‘||segment_name||’  modify  subpartition  ‘||partition_name||’  shrink  space;’||chr(10)  from  user_segments  where  segment_type=TABLE  SUBPARTITION’  ‘;  

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

相關文章