UPDATE GLOBAL INDEXES 仅对EXCHANGE、DROP、TRUNCATE、SPLIT、MERGE、MOVE等特定分区DDL有效,且须紧接主语句后、分号前;不支持ADD/RENAME;与ONLINE联用仅限MOVE/SPLIT/MERGE;失效常见原因包括DDL中断、索引原有UNUSABLE状态或权限不足。
为什么 UPDATE GLOBAL INDEXES 不生效?
分区操作(比如 alter table ... drop partition 或 split partition)默认会令全局索引(global index)进入 unusable 状态,除非显式声明维护。很多人以为加了 update global indexes 就万事大吉,结果发现索引还是失效了——根本原因是:它只对**支持该语法的 ddl 操作**有效,且必须写在正确位置。
-
UPDATE GLOBAL INDEXES仅适用于EXCHANGE、DROP、TRUNCATE、SPLIT、MERGE、MOVE这几类分区操作;ADD PARTITION和RENAME PARTITION不支持该子句 - 语法必须紧接在 DDL 主语句之后、分号之前,不能换行或用注释隔开,否则 Oracle 会忽略它
- 如果表上有多个全局索引,该子句会一并维护全部,但任一索引维护失败(如空间不足、唯一约束冲突),整个 DDL 就回滚
UPDATE GLOBAL INDEXES 和 ONLINE 能一起用吗?
能,但有严格限制:只有 UPDATE GLOBAL INDEXES + ONLINE 同时出现在支持的 DDL 中才真正联机。常见误区是以为加了 ONLINE 就自动维护索引——其实不加 UPDATE GLOBAL INDEXES,ONLINE 只保证基表可读写,索引仍会变 UNUSABLE。
- 仅
MOVE PARTITION、SPLIT PARTITION、MERGE PARTITIONS支持同时指定ONLINE和UPDATE GLOBAL INDEXES -
DROP PARTITION支持UPDATE GLOBAL INDEXES,但不支持ONLINE(因为会物理删除数据) - 使用时注意:联机维护期间,全局索引上的 DML 会被阻塞或延迟,尤其大索引可能卡住应用写入
执行后索引仍是 UNUSABLE?检查这三点
即使语法正确,索引仍可能失效,大概率是以下情况之一:
- DDL 执行中途报错退出(例如表空间满),但部分索引已标记为
UNUSABLE,而事务已回滚,残留状态没清理 - 目标索引本身已有
UNUSABLE状态,Oracle 不会在 DDL 中自动修复旧问题,需先手动ALTER INDEX ... REBUILD - 用户权限不足:执行 DDL 的账号必须对索引有
ALTER权限,否则维护跳过且无提示(日志里只有警告)
查状态用:SELECT index_name, status FROM user_indexes WHERE table_name = 'YOUR_TABLE';
替代方案:不用 UPDATE GLOBAL INDEXES 怎么办?
当语法不支持或风险太高(比如生产环境不敢跑长事务),更稳妥的做法是“先标记、后重建”:
- 用
ALTER INDEX ... UNUSABLE主动置为不可用,再做分区操作,最后ALTER INDEX ... REBUILD ONLINE—— 控制粒度更细,可分批重建 - 对超大索引,考虑改用
LOCAL INDEX:分区操作不影响其他分区索引,但前提是查询条件总带分区键,否则性能可能反降 - 如果只是临时维护,可用
DBMS_PART.INDEX_MGMT包的BUILD_PART_INDEX异步构建单个分区索引,避免锁全表
最常被忽略的是:重建全局索引时,REBUILD 默认不带 ONLINE,会锁整个索引。线上务必加上 ONLINE 关键字,否则应用查不到索引数据。

















