整理表碎片通常的方法是move表,當然move是不能在線進行的,而且move后相應的索引也會失效,oracle針對上述不足,在10g時加入了shrink,那這個方法能不能在生產中使用呢?
shrink的一個優點是能在線進行,不影響表上的DML操作,當然,並發的DML操作在shrink結束的時刻會出現短暫的block;shrink的另外一個優點是在碎片整理結束后,表上相關的index仍然enable。對於第二點進一步說明下,shrink在整理表碎片的時候,行源的rowid已經發生改變,那為什么相關的索引還能enable呢?其實oracle在進行shrink的時候會對相應的索引進行維護,以保證index在shrink結束的時候index仍然有效。這個維護不同於索引rebuild,不會對索引的空間進行整理,shrink有cascede選項,如果在shrink的時候加上該選項,就會對表上相應的索引空間進行整理。
ALTER TABLE test SHRINK SPACE CASCADE;
shrink也可以分兩步進行,第一步先執行ALTER TABLE test SHRINK SPACE compact,此時oracle會在高水位線以下將row盡量向segment的頂部移動,但不收縮高水位線,即不釋放空間。這個操作對於那些在嘗試讀取已經被釋放的塊的查詢是有益的。第二不執行ALTER TABLE test SHRINK SPACE,此時第一步中的結果已經存儲到磁盤,不會重新在整理碎片,只是收縮高水位,釋放空間。第二步操作應該在系統不繁忙時候進行。
我們先看下shrink的工作原理,shrink的算法是從segment的底部開始,移動row到segment的頂部,移動的過程相當於delete/insert操作的組合,在這個過程中會產生大量的undo和redo信息。在HP Unix上還存在BUG,在10.1.0.3.0中,在shrink的時候可能會觸發BUG 3888229,產生巨大數量的redo和undo。move是直接移動數據塊的位置,鑒於上面的原因,在使用shrink的時候,耗時可能非常長,通常慢於move。
對於空間的要求,shrink不需要額外的空間,move需要兩倍的空間。
通過上面的分析,shrink雖然有online的特性,但是也存在很多問題,所以,在進行表碎片整理的時候,還是建議停機檢修,使用move,以下是一些move時候的注意點:
1、move前最好邏輯備份待整理的表;
2、對於大表,建議開啟並行和nologging
alter table test move nologging parallel 2;
3、整理完畢后重建相關的索引
alter index ind_test rebuild nologging parallel 2;
4、恢復表和索引的並行度、logging
alter table test logging parallel 1;
轉自:http://blog.itpub.net/29821678/viewspace-1270131/