会丢失索引,且是默认行为:local索引分区变unusable,全局索引整体失效;compress basic压缩率高但仅支持批量加载,oltp支持dml但有延迟;move不自动释放空间,需加deallocate unused或shrink。
move partition 会丢失索引吗?
会,而且是默认行为。执行 ALTER TABLE ... MOVE PARTITION 后,该分区上所有 LOCAL 索引分区会自动进入 UNUSABLE 状态,查询时若走不到该索引可能不报错,但执行计划里会出现 INDEX RANGE SCAN (UNUSABLE) —— 实际就是失效了。
- 必须显式重建:用
ALTER INDEX ... REBUILD PARTITION或带UPDATE INDEXes子句(Oracle 12c+ 支持) -
UPDATE INDEXES能保索引可用,但要求索引本身支持在线重建(比如不能有函数索引或域索引) - 如果表有全局索引,MOVE PARTITION 会直接让整个全局索引失效,必须
REBUILD全局索引,不能只 rebuild 某个分区
COMPRESS FOR OLTP 和 COMPRESS BASIC 选哪个?
看数据写入模式。历史分区通常只读,COMPRESS BASIC 压缩率更高、CPU 开销更低;但如果你后续还要往这个分区 insert 少量数据(比如补录),就得选 COMPRESS FOR OLTP,否则会报 ORA-64307: hybrid columnar compression is not supported for this operation。
-
COMPRESS BASIC:仅支持 bulk load(如INSERT /*+ APPEND */)和 MOVE 时压缩,日常 DML 不触发压缩 -
COMPRESS FOR OLTP:支持常规 DML 压缩,但 MOVE 后首次 insert 可能触发 block reorganization,延迟略高 - 验证压缩效果:查
USER_TAB_PARTITIONS的COMPRESSION和COMPRESS_FOR列,别只信 DDL 是否执行成功
MOVE PARTITION 前要不要先禁用约束?
不需要禁用主键/唯一约束,但外键约束要小心。MOVE PARTITION 本身不校验外键,但如果目标分区有外键引用,且你又在 MOVE 同时做 delete 或 update 关联数据,可能触发约束检查失败。
- 外键列没被修改,只是分区移动:完全安全,不用动约束
- MOVE 后立刻 truncate 或 drop 分区?确保没启用
ON DELETE CASCADE,否则可能误删子表数据 - 唯一约束依赖的索引如果是 local,MOVE 后索引分区失效 → 约束暂时“不生效”,但不是说可以乱插重复值,DML 仍会检查(因为约束状态仍是 ENABLED VALIDATED)
为什么 MOVE 后空间没减少?
常见原因是没清理 high water mark(HWM)。MOVE 会分配新段、复制数据、更新数据字典,但旧段空间不会自动释放回表空间,除非你加 SHRINK SPACE 或手动 deallocate unused。
- MOVE 本身不 shrink:执行完后立即查
DBA_SEGMENTS,会发现 segment size 没变,甚至略增(因新旧段并存) - 加
DEALLOCATE UNUSED:在 MOVE 语句末尾加上,例如MOVE PARTITION p_2022 DEALLOCATE UNUSED - 或者 MOVE 后单独执行
ALTER TABLE ... DEALLOCATE UNUSED,但注意这只能回收 HWM 以上的空闲空间 - 如果用了 ASSM 表空间,HWM 下方的碎片空间无法通过 DEALLOCATE 回收,得靠 Segment Advisor 建议或导出导入










