Oracle 中 SHRINK 與 MOVE 操作的比較
在 Oracle 數據庫中,SHRINK
和 MOVE
都是用于重組表和索引以減少空間碎片的重要操作,但它們在實現方式和適用場景上有顯著區別。
SHRINK 操作
基本語法
ALTER TABLE table_name SHRINK SPACE [COMPACT] [CASCADE];
特點
- 在線操作:可以在表被使用時執行(DML操作仍可進行)
- 漸進式:可以分階段執行(先COMPACT再最終收縮)
- 僅適用于ASSM表空間:自動段空間管理(ASSM)的表空間才支持
- 不改變存儲參數:不會改變表的INITIAL或NEXT存儲參數
- 需要行移動:需要啟用行移動
ALTER TABLE table_name ENABLE ROW MOVEMENT;
優點
- 對業務影響小
- 可以回收高水位線(HWM)以上的空間
- 操作可中斷,不會回滾已完成的壓縮
缺點
- 不能改變表的物理存儲屬性
- 不能將表移動到其他表空間
MOVE 操作
基本語法
MOVE[ filter_condition ][ ONLINE ][ segment_attributes_clause ][ table_compression ][ index_org_table_clause ][ { LOB_storage_clause | varray_col_properties }... ][ parallel_clause ][ allow_disallow_clustering ][ UPDATE INDEXES[ ( index { segment_attributes_clause| update_index_partition }[, index { segment_attributes_clause| update_index_partition } ]...)]]
ALTER TABLE table_name MOVE [TABLESPACE tablespace_name] [ONLINE];
特點
- 離線操作:默認會鎖定表(除非使用ONLINE選項,12C+)
- 完全重組:重建表結構,重置高水位線
- 可跨表空間:可以移動到不同的表空間
- 改變物理存儲:可以改變存儲參數
- 需要重建索引:移動后相關索引會失效,需要重建
優點
- 能徹底重組表,性能提升明顯
- 可以改變表的物理存儲位置和參數
- 適用于所有表空間類型
缺點
- 對業務影響較大(除非使用ONLINE選項)
- 需要額外處理索引重建
- 不能分階段執行
關鍵區別對比
特性 | SHRINK | MOVE |
---|---|---|
操作類型 | 在線 | 默認離線(可在線) |
空間回收 | 回收HWM以上空間 | 完全重置HWM |
表空間限制 | 僅ASSM表空間 | 所有表空間 |
表空間移動 | 不支持 | 支持 |
存儲參數 | 不改變 | 可改變 |
索引處理 | 自動維護 | 需要重建 |
適用場景 | 日常維護 | 大規模重組/遷移 |
使用建議
- 日常空間維護:使用SHRINK進行定期空間回收
- 性能優化:當表嚴重碎片化時使用MOVE徹底重組
- 表空間遷移:必須使用MOVE操作
- 關鍵業務表:考慮使用MOVE ONLINE減少影響
注意事項
- 兩種操作都會產生大量重做日志(redo),應在低峰期執行
- 操作前建議備份重要數據
- 大表操作可能需要考慮分批進行
- 監控UNDO表空間使用情況,避免操作失敗