ALTER INDEX REBUILD 是恢复 MOVE 后失效索引的唯一有效操作;需先检查索引状态、函数有效性、物化视图日志及 LOBINDEX,再按需指定 TABLESPACE 和 ONLINE 重建,并同步更新统计信息与迁移 LOB 段。
ALTER INDEX REBUILD 是唯一能恢复失效索引的操作
执行 alter table ... move tablespace 后,所有基于该表的索引(包括主键、唯一、普通 b-tree、函数索引、位图索引)状态都会变成 unusable,不是偶然出错,而是 oracle 对 rowid 变更的明确响应。此时 alter index ... rebuild 不是“可选优化”,而是必须执行的修复动作——没有替代语法,update indexes 仅适用于分区表的 split/exchange 场景,对普通 move 完全无效。
重建前必须确认索引当前状态和依赖对象
直接跑 REBUILD 可能失败或产生新问题,先查清楚:
- 用
SELECT index_name, status, index_type FROM user_indexes WHERE table_name = 'YOUR_TABLE'确认哪些索引是UNUSABLE - 函数索引要检查其依赖的函数是否仍有效,否则
REBUILD报ORA-04045 - 带物化视图日志的表,
MOVE已失败或后续 DML 会报错,必须先DROP MATERIALIZED VIEW LOG再重建 - LOB 列对应的
LOBINDEX不在user_indexes中,需单独查user_lobs并重建对应索引
REBUILD 时要不要指定 TABLESPACE?怎么加 ONLINE?
不指定表空间,索引默认建在原位置;想一并迁移到新表空间,必须显式写 TABLESPACE new_ts。是否加 ONLINE 取决于业务容忍度:
-
ALTER INDEX idx_name REBUILD ONLINE允许 DML 并发,但要求表有主键或唯一约束,且重建期间索引处于VALIDATING状态,查询可能绕过索引走全表扫描 - 没主键/唯一约束,或不能接受性能抖动,就用普通
REBUILD,但需安排维护窗口——它会持锁直到完成 -
ONLINE不支持 LOBINDEX 重建,这类索引必须离线重建 - 大索引建议加
PARTITION (DEGREE 4)加速,但注意并行度过高会争抢 CPU 和 I/O 资源
别漏掉统计信息和 LOB 段
REBUILD 只修索引,不碰统计信息和 LOB 存储结构:
-
USER_TAB_STATISTICS.NUM_ROWS在MOVE后已不准,必须手动执行DBMS_STATS.GATHER_TABLE_STATS,否则优化器可能选错执行计划 - CLOB/BLOB 字段的
LOBSEGMENT和LOBINDEX不随表移动,MOVE后它们仍留在旧表空间,要用ALTER TABLE t MODIFY LOB(col) (STORE AS (TABLESPACE new_ts))单独迁移 - 没处理 LOB 段,下次
MOVE表时可能因空间不足失败,或引发隐式扩展导致性能突降











