MERGE PARTITIONS 仅支持合并两个相邻的 RANGE 或 LIST 分区,需验证边界值连续性、VALUES IN 完整性,且必须指定目标分区并加 UPDATE INDEXES;不支持 HASH、间隔、引用及 DEFAULT 分区,非相邻或多分区合并均报错。

MERGE PARTITIONS 只能合并两个相邻的 RANGE 或 LIST 分区,不支持 HASH、引用分区、间隔分区或多个分区批量合并
确认分区是否真正「相邻」
不能只看 PARTITION_NAME 字母顺序或 PARTITION_POSITION,必须验证边界值是否连续:
- RANGE 分区:后一分区的
HIGH_VALUE(即VALUES LESS THAN)必须严格等于前一分区的上界值;若HIGH_VALUE是表达式(如TO_DATE('2025-01-01','YYYY-MM-DD')),需用DBMS_METADATA.GET_DDL或DBMS_LOB.SUBSTR(high_value)解析真实值 - LIST 分区:两分区的
VALUES IN列表必须无交集,且并集能覆盖所有原值;Oracle 不自动去重、不排序,漏值会导致后续INSERT报ORA-14400 - DEFAULT 分区不可参与任何
MERGE PARTITIONS操作,指定即报错
执行 MERGE PARTITIONS 的正确语法与关键参数
语句必须显式写出两个分区名,并指定目标分区(必须是二者之一):
ALTER TABLE t MERGE PARTITIONS p1, p2 INTO PARTITION p2 UPDATE INDEXES;
常见错误包括:
- 写成
MERGE PARTITIONS p1,p2,p3→ 报ORA-14054 - 写成
MERGE PARTITIONS p1,p3(跳过p2)→ 报ORA-14055 - 对 HASH 分区表执行 → 报
ORA-14255 - 漏掉
UPDATE INDEXES→ local 索引分区状态变为UNUSABLE,后续 DML 失败
合并 LIST 分区时 VALUES IN 必须手动补全
Oracle 不生成合并后的值列表,必须在语句中显式声明完整集合:
ALTER TABLE t MERGE PARTITIONS p_a, p_b INTO PARTITION p_ab
VALUES IN ('A','B','C') UPDATE INDEXES;
如果原 p_a 是 VALUES IN ('A','B')、p_b 是 VALUES IN ('C'),但语句里只写 VALUES IN ('A','C'),插入 'B' 就会失败。
注意:VALUES IN 中的值顺序无关,但缺失任意一个原始值都不可接受。
性能与操作风险必须提前评估
MERGE PARTITIONS 是物理重写操作,不是元数据变更:
- 全程持有
EXCLUSIVE DML锁,表不可写 - 数据量大时 I/O 和 redo 压力显著,可能持续数小时;建议先查
NUM_ROWS和BLOCKS估算规模 - 目标表空间需预留 ≈ 两分区之和的空间,PGA 也要足够(否则触发磁盘排序)
- 不支持
NOLOGGING子句,强行添加会报ORA-14049
多分区合并只能分步进行,每一步都是独立事务,无原子性保障——中间失败需人工回退,没有“回滚整个合并链”的机制。


















