本地分区索引重建失败因索引整体UNUSABLE时不可单分区重建;须先ALTER INDEX ... REBUILD全局恢复,再按需REBUILD PARTITION;验证需检查状态、统计信息及执行计划三者。
分区索引重建失败:ALTER INDEX ... REBUILD PARTITION 报错 ORA-14086
直接原因:你试图对一个 本地分区索引(local) 的单个分区执行 rebuild partition,但该索引是 unusable 状态——oracle 不允许在索引整体失效时单独重建某个分区。
本地索引的分区与表分区严格绑定,一旦某个分区索引失效(比如因 ALTER TABLE ... EXCHANGE PARTITION 未带 INCLUDING INDEXES),整个索引状态会变成 UNUSABLE,此时必须先让索引“可操作”才能细分处理。
-
REBUILD PARTITION只适用于索引整体状态为VALID时的局部维护 - 若查询
USER_INDEXES.STATUS或USER_IND_PARTITIONS.STATUS返回UNUSABLE,说明不能跳过全局重建步骤 - 强行执行会报
ORA-14086: a partitioned index may not be rebuilt as a whole(注意这个错误码实际常被误读;真正触发它的往往是状态不合法而非语法错)
恢复可用性的两步走:先 REBUILD 全局,再按需 REBUILD PARTITION
不是所有场景都需要重建全部分区。关键是分清「索引不可用」是全局性还是局部性问题:
- 如果只有个别分区索引损坏(
USER_IND_PARTITIONS.STATUS = 'UNUSABLE',但USER_INDEXES.STATUS = 'VALID'),可直接对那个分区执行ALTER INDEX idx_name REBUILD PARTITION p_name - 如果
USER_INDEXES.STATUS = 'UNUSABLE',必须先运行ALTER INDEX idx_name REBUILD—— 这会重建所有分区,且默认使用当前表分区定义 - 重建后立即检查
USER_IND_PARTITIONS.STATUS,确认是否全部变回USABLE;如有遗漏,再针对性补建 - 大表慎用全量重建:它会持有 DML 锁较长时间,建议在低峰期加
ONLINE(仅限非唯一本地索引 + Oracle 12c+)
ONLINE 选项的适用边界和隐形代价
ONLINE 能避免锁表,但不是万能开关。它只在特定组合下生效:
- 仅支持
LOCAL索引(GLOBAL分区索引不支持在线重建分区) - 要求索引不含唯一约束(
UNIQUE LOCAL索引不支持ONLINE REBUILD PARTITION) - 底层会创建临时段并重放 DML,IO 和临时空间压力明显增大;若空间不足,会静默失败并留一个
UNUSABLE临时索引段 - 执行后务必查
USER_OBJECTS,确认没有残留的TEMPORARY状态对象
验证是否真修复:别只看 STATUS,要查执行计划
状态列变 USABLE 不代表索引真能用。常见假成功:
- 分区键列统计信息过期,导致 CBO 拒绝选择该索引——运行
DBMS_STATS.GATHER_INDEX_STATS或全表重收集 - 索引列上有函数或表达式,而查询条件没匹配上函数形式,看起来“可用”但实际不走
- 用
EXPLAIN PLAN FOR SELECT ...后查PLAN_TABLE,确认OBJECT_NAME是你的索引名,且OPERATION含INDEX RANGE SCAN或类似字样 - 特别注意分区裁剪是否生效:
PARTITION_START和PARTITION_STOP应显示具体分区名,而非KEY或ALL
分区索引的“可用”是状态、统计、执行路径三者叠加的结果,漏掉任意一环,应用照样慢得像没建索引。










