Oracle 中 SHRINK 与 MOVE 操作的比较
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表空间使用情况,避免操作失败