MOVE后索引全变UNUSABLE是必然结果,不是故障;因ROWID变更导致所有索引(含主键、唯一、函数、位图索引)状态变为UNUSABLE,需手动重建,且LOB段和统计信息也须单独处理,否则引发查询异常或性能问题。

MOVE后索引全变UNUSABLE是必然结果,不是故障
Oracle执行ALTER TABLE ... MOVE时,会彻底重写表段、分配新ROWID,所有依赖原物理地址的索引(包括主键、唯一索引、普通B-Tree、函数索引、位图索引)都会立刻变为UNUSABLE状态。这不是bug,是设计使然——索引不会“自动跟随搬迁”。一旦触发ORA-01502,说明已有SQL尝试走失效索引,必须处理。
查哪些索引失效:别只看user_indexes,分区表要查子视图
普通表用:SELECT index_name, status FROM user_indexes WHERE table_name = 'YOUR_TABLE';但若表是分区表,status字段在user_indexes里可能显示N/A或不准确,得查真实分区状态:
SELECT index_name, partition_name, status FROM user_ind_partitions WHERE index_name IN (SELECT index_name FROM user_indexes WHERE table_name = 'YOUR_TABLE')- 局部索引失效只影响对应分区,全局索引失效则整索引不可用
- LOB字段对应的
LOBINDEX也需单独检查:SELECT segment_name, segment_type FROM user_segments WHERE segment_name LIKE '%YOUR_TABLE%LOB%'
重建索引不能只写REBUILD,参数和场景必须匹配
重建不是“统一执行ALTER INDEX idx REBUILD”就能完事,不同情况参数差异直接影响可用性和窗口:
- 非分区表:直接
ALTER INDEX idx_name REBUILD TABLESPACE new_ts,加ONLINE可减少锁(12cR2+),但要求表有主键/唯一约束,且期间DML仍可能被短暂阻塞 - 全局索引(分区表):用
ALTER INDEX global_idx REBUILD,不能带UPDATE GLOBAL INDEXES——那是ALTER TABLE SPLIT/MERGE PARTITION才支持的选项 - 局部索引(分区表):要么
ALTER INDEX local_idx REBUILD PARTITION part_name,要么ALTER TABLE tab MODIFY PARTITION part_name REBUILD UNUSABLE LOCAL INDEXES - 带并行加速:大索引加
PARALLEL (DEGREE 4),但记得后续执行ALTER INDEX idx_name NOPARALLEL归还资源
重建完还得补两件事:统计信息和LOB段
MOVE + 索引重建只是基础动作,漏掉这两项,查询性能可能骤降或报错:
-
DBMS_STATS.GATHER_TABLE_STATS必须显式执行——NUM_ROWS、AVG_ROW_LEN等统计值在MOVE后已过期,优化器可能选错执行计划 - 含CLOB/BLOB列的表,MOVE只动了表段,
LOBSEGMENT和LOBINDEX还在原表空间,得单独MOVE:ALTER TABLE t MOVE LOB(col) STORE AS (TABLESPACE new_ts) - 物化视图日志若存在,MOVE前必须先
DROP,否则操作失败;重建后需重新创建
最易被忽略的是LOB段迁移和统计信息刷新——它们不报错,但会让后续查询慢得离谱,或者突然在某次应用发布后崩出ORA-01502。


















