合并range分区必须显式指定两个真正相邻的分区名,其相邻性由high_value决定而非名称顺序;语法为alter table t merge partitions p1,p2 into partition p1_new update indexes;操作锁表、重写数据、需评估数据量、pga及索引状态。

只能合并两个相邻的 RANGE 分区,且必须显式写出分区名;否则直接报 ORA-14048 或 ORA-14255。
怎么确认两个 RANGE 分区是否真正相邻
不能只看 PARTITION_NAME 字母顺序或 PARTITION_POSITION。RANGE 分区的“相邻”由 HIGH_VALUE 决定:后一分区的 VALUES LESS THAN 必须严格等于前一分区的上界值。
- 查边界:
SELECT partition_name, high_value FROM user_tab_partitions WHERE table_name = 'YOUR_TABLE' ORDER BY partition_position - 若
HIGH_VALUE是表达式(如TO_DATE('2025-01-01','SYYYY-MM-DD')),需用DBMS_LOB.SUBSTR(high_value)或DBMS_METADATA.GET_DDL解析真实值 - DEFAULT 分区不可参与
MERGE PARTITIONS,指定即报错
执行 MERGE PARTITIONS 的正确写法和关键参数
语法强制要求两个明确分区名、一个目标分区名,且不支持通配符或条件子句。操作是物理重写,不是元数据变更。
- 基本语句:
ALTER TABLE t MERGE PARTITIONS p1, p2 INTO PARTITION p1_new UPDATE INDEXES -
UPDATE INDEXES必须加——不加会导致 local 索引状态变为UNUSABLE,后续 DML 失败 - 合并后新分区的边界自动取较高值(即原
p2的VALUES LESS THAN),无需手动指定 - 不能在语句中加
NOLOGGING:Oracle 不支持该子句,加了会报ORA-14049
执行前必须评估的三个实际风险点
这个操作锁表、读全量数据、触发大量 redo,不是“改个名字”那么简单。
- 查数据量:
SELECT num_rows, blocks FROM user_tab_partitions WHERE table_name = 'T' AND partition_name IN ('p1','p2');千万行以上建议低峰期执行 - 算空间:新分区大小 ≈ 原两分区之和,且 PGA 需容纳排序中间结果;
pga_aggregate_target过小会强制磁盘排序,速度骤降 - 验证索引状态:执行完立刻查
SELECT index_name, status FROM user_indexes WHERE table_name = 'T';global 索引可能短暂为UNUSABLE,需手动ALTER INDEX ... REBUILD
最容易被忽略的是 LIST 分区和 RANGE 分区的处理差异——这里只谈 RANGE,但如果你误把 LIST 分区当 RANGE 操作,VALUES IN 漏值就会导致后续所有插入都报 ORA-14400。别跳过查 HIGH_VALUE 这步。











