update global indexes 仅标记全局索引异步维护,不立即修复;索引保持 valid 但 orphaned_entries=yes,查询可能返回错误结果,需手动执行 cleanup_gidx 或调整默认维护任务。
直接加 update global indexes 就能保留全局索引有效,但必须注意:它不实时重建索引,只是标记为需异步维护;不加就必然触发 ora-01502 报错,所有走该索引的查询全部失败。
为什么 UPDATE GLOBAL INDEXES 不等于“立刻修好索引”
Oracle 19c 中,UPDATE GLOBAL INDEXES 是个“延迟维护”开关,不是同步修复指令。它只做两件事:防止索引状态变成 UNUSABLE;在 DBA_INDEXES.ORPHANED_ENTRIES 字段标为 YES,表示有游离条目待清理。
- 索引仍保持
VALID状态,SQL 可正常执行 - 但实际查询可能因游离条目产生错误结果(尤其涉及唯一约束或精确匹配时)
- 系统默认靠后台任务
PMO_DEFERRED_GIDX_MAINT_JOB在每天凌晨 2:00(太平洋时间)自动处理,这个时间点在生产环境大概率不合适
执行 DROP PARTITION 时必须配的三步操作
跳过任何一步,都可能让索引“看似活着,实则失效”:
- 加
UPDATE GLOBAL INDEXES—— 否则STATUS变UNUSABLE,所有依赖该索引的查询报ORA-01502 - 提前把目标索引设为
NOLOGGING(如允许丢失):ALTER INDEX idx_name NOLOGGING—— 否则维护过程生成巨量 Redo,拖慢主备同步 - 业务低峰期手动清理游离条目:
exec DBMS_PART.CLEANUP_GIDX('SCHEMA', 'TABLE_NAME')—— 避免等默认凌晨任务,也避免dbms_scheduler.run_job('PMO_DEFERRED_GIDX_MAINT_JOB')引发突发 Redo 峰值
LOCAL 索引根本不用加 UPDATE GLOBAL INDEXES
本地索引(LOCAL)跟分区绑定,删分区时索引分区自动跟着删,不会失效。所以对 LOCAL 索引,ALTER TABLE ... DROP PARTITION 直接执行即可,加 UPDATE GLOBAL INDEXES 语法报错——Oracle 明确拒绝这个组合。
- 验证是否是本地索引:
SELECT index_type FROM dba_indexes WHERE index_name = 'YOUR_IDX',返回LOCAL即可放心删 - 误给本地索引加该子句会报
ORA-14048:“alter index and alter partition may not be combined” - 如果表同时有 GLOBAL 和 LOCAL 索引,只对 GLOBAL 索引生效,LOCAL 部分不受影响
真正容易被忽略的是 ORPHANED_ENTRIES = YES 这个状态——它不阻断 SQL,却悄悄埋下数据一致性隐患;而 CLEANUP_GIDX 手动执行又常被当成“可选优化”,直到某次唯一约束校验失败才暴露问题。











