local索引比global索引更易维护,因其与表分区严格一一绑定,drop/split/truncate/exchange分区时自动同步更新状态;而global索引完全解耦,操作后常变unusable且需全量重建。
local 索引比 global 索引更容易维护,根本原因不是配置技巧或操作习惯,而是 oracle 对二者生命周期的绑定方式不同:本地索引与表分区严格一一对应,全局索引则完全解耦。
ALTER TABLE DROP PARTITION 时 LOCAL 索引自动清理
执行 ALTER TABLE t DROP PARTITION p1 后:
- 对应的 LOCAL 索引分区被同步删除,DBA_INDEXES.STATUS 仍为 VALID,无需人工干预
- GLOBAL 索引直接变为 UNUSABLE,查询报错 ORA-01502
- 若漏加 UPDATE GLOBAL INDEXES,后续只能全量重建:ALTER INDEX idx_global REBUILD,亿级表可能耗时数小时
TRUNCATE / SPLIT / EXCHANGE PARTITION 的响应差异
LOCAL 索引在以下操作中自动保持可用:
- TRUNCATE PARTITION p2:对应索引段清空,但整体状态仍是 VALID
- SPLIT PARTITION p3:原索引分区自动拆成两个新分区,状态均为 USABLE
- EXCHANGE PARTITION:索引分区状态继承源表对应分区状态
而 GLOBAL 索引对这些操作无感知,只要底层数据物理位置变动(如分区被删、交换、移动),索引指针即失效——这不是 bug,是设计使然
重建粒度:能按分区做,才是真灵活
LOCAL 索引支持分区级重建:
- ALTER INDEX idx_local REBUILD PARTITION p3,不影响其他分区查询
- 支持位图索引(GLOBAL 不支持)
- GLOBAL 索引不接受 REBUILD PARTITION,语法报错 ORA-14057
- 全局索引重建必须全量扫描+排序,锁表时间长、临时表空间压力大
容易被忽略的“自动”边界
别误以为 LOCAL 索引永远不用管:
- MOVE PARTITION 不触发自动维护,对应索引分区会变 UNUSABLE,必须手动 REBUILD PARTITION
- SHRINK SPACE 或 FLASHBACK TABLE 到 SCN 也会让局部索引分区失效
- 查询条件不含分区键时(如 WHERE customer_id = 123),即使建了 LOCAL 索引,也可能全分区扫描,性能反不如 GLOBAL











