MERGE PARTITION 不会自动重建本地索引分区,必须显式添加 UPDATE INDEXES 子句避免索引失效;但该操作仅保证可用性,不优化结构,仍需 REBUILD PARTITION 消除碎片、重排键序并更新统计信息。
MERGE PARTITION 不会自动重建本地索引分区
执行 merge partitions p0,p1 into partition p1 后,p0 分区的数据物理上被迁移到 p1,但 oracle 并不会自动重写或重组 p1 对应的本地索引分区段。原 p0 的本地索引分区仍保留在数据字典中,状态变为 unusable(除非显式加 update indexes)。不加该子句时,查询涉及该分区会直接报错 ora-01502: index ... or partition of such index is in unusable state。
- 必须加
UPDATE INDEXES才能避免本地索引失效;不加就等于“留坑”,后续任何走该索引的查询都失败 -
UPDATE INDEXES仅保证索引可用,但不优化结构——合并后索引叶块可能大量空闲、高度未降、clustering factor 失真 - 全局索引不受影响(自动维护),但若合并前已有 orphaned entries,需手动运行
DBMS_PART.CLEANUP_GIDX
合并后索引存在逻辑碎片与统计失真
即使加了 UPDATE INDEXES,索引分区只是“可用”,不是“健康”。因为 MERGE 是物理数据迁移 + 索引条目追加式插入,不是重新排序构建。结果是:
- 索引叶块中残留大量标记为删除(
DEL_LF_ROWS)的旧条目,尤其当p0历史 DML 频繁时 -
HEIGHT不变,但LF_ROWS / DEL_LF_ROWS比值可能 > 0.2,说明有效数据密度低 -
NUM_ROWS统计信息仍反映合并前各分区之和,优化器误判选择性,易选错执行计划
重建不是必须,但 coalesce 往往不够用
对合并后的本地索引分区,ALTER INDEX ... COALESCE 只能合并相邻叶块中的空闲空间,无法消除跨块的删除标记,也不能重排键顺序。而 MERGE 后的典型问题是跨分区键范围混杂、高水位线(HWM)未下降、块内碎片离散——这时 COALESCE 基本无效。
- 真正需要的是
ALTER INDEX ... REBUILD PARTITION或REBUILD ONLINE PARTITION - 重建会生成全新索引段,清空所有删除标记,重排键序,重设 HWM,并触发准确统计信息收集
- 注意:重建期间该索引分区不可用(除非加
ONLINE),且会产生大量 REDO;亿级表建议搭配NOLOGGING和业务低峰期
容易忽略的关键点:SHRINK SPACE 和统计刷新必须配套
只重建索引还不够。MERGE 后基表分区段的高水位线(HWM)仍卡在原 p0+p1 总量位置,全表扫描仍要读大量空块。而索引重建本身不触发表段收缩。
- 必须跟
ALTER TABLE ... MODIFY PARTITION p1 SHRINK SPACE CASCADE配套,否则 I/O 浪费持续存在 -
DBMS_STATS.GATHER_TABLE_STATS必须强制重收集,且指定GRANULARITY => 'PARTITION',否则USER_TAB_PARTITIONS.NUM_ROWS仍是旧值 - 验证是否生效:查
USER_IND_PARTITIONS.STATUS是否为VALID,USER_TAB_PARTITIONS.HIGH_WATER_MARK是否下降,INDEX_STATS.LF_ROWS是否接近实际行数











