可以,但需满足表空间为ASSM且已启用ROW MOVEMENT;必须逐个分区执行SHRINK SPACE,不支持一键收缩整表;COMPACT仅整理碎片,CASCADE才下调HWM并收缩本地索引。
分区表能直接 SHRINK SPACE 吗?
可以,但必须满足前提:分区表所在的表空间是 assm(自动段空间管理),且每个待收缩的分区(或子分区)都已启用 row movement。oracle 19c 对分区表的 shrink space 支持完整,但不支持“一键收缩整个分区表”,必须逐个处理分区——哪怕你对一级分区执行 shrink space,也不会自动级联到其子分区。
怎么给分区启用 ROW MOVEMENT?
分区表的 ROW MOVEMENT 是按表级控制的,不是分区级开关。执行一次即可:
ALTER TABLE your_partitioned_table ENABLE ROW MOVEMENT;
注意:ENABLE ROW MOVEMENT 不会锁表,但若表上有依赖 ROWID 的触发器(如 BEFORE UPDATE ... REFERENCING OLD AS old),需临时禁用,否则后续 SHRINK 会报 ORA-10636。
验证是否生效:
SELECT table_name, row_movement FROM user_tables WHERE table_name = 'YOUR_PARTITIONED_TABLE';
SHRINK 分区时该用 COMPACT 还是 CASCADE?
对分区表,SHRINK SPACE 必须显式指定目标对象(分区名),且 COMPACT 和 CASCADE 行为差异比普通表更关键:
-
SHRINK SPACE COMPACT:只整理该分区内部碎片,不调低高水位线(HWM),不释放空间回表空间;DML 可并发,适合白天在线执行 -
SHRINK SPACE CASCADE:先COMPACT,再下调 HWM,并同步收缩该分区上的本地索引(LOCAL INDEX);需短暂获取分区级 X 锁,阻塞对该分区的 DDL 和部分 DML,务必安排在业务低峰期
常见误操作:只对分区执行 SHRINK SPACE(无后缀),等效于 COMPACT + 下调 HWM,但**不处理任何索引**——本地索引仍碎,查询性能可能没改善。正确写法是:
ALTER TABLE your_partitioned_table MODIFY PARTITION p202401 SHRINK SPACE CASCADE;
LOB 分区或 SECUREFILE LOB 怎么办?
如果分区包含 SECUREFILE LOB 列,SHRINK SPACE CASCADE 会跳过 LOB 段,不回收其空间。必须单独处理:
- 查 LOB 段使用情况:
DBMS_SPACE.SPACE_USAGE(用语法2变体,专用于 SECUREFILE) - 收缩 LOB 段:
ALTER TABLE your_table MODIFY LOB (lob_col) (SHRINK SPACE)
而 BASICFILE LOB 在 19c 中完全不支持 SHRINK,只能用 MOVE PARTITION 配合 REBUILD 索引——但 MOVE 会锁整个分区,且需额外空间。
最后别忘了:所有 SHRINK 操作后,必须手动收集统计信息,否则优化器仍按旧 NUM_ROWS 和 BLOCKS 估算执行计划,容易选错执行路径。


















