分區索引是大型資料倉庫與高交易量 OLTP 系統實現資料生命週期管理、查詢裁剪的關鍵技術。本文系統梳理 Local/Global 分區索引的架構差異、建立語法、維護特性與選型指南。
| 特性 | Local 分區索引 | Global 分區索引 |
|---|---|---|
| 分區對齊 | 與表分區 **一對一對齊** (相同分區鍵、相同數量) | **獨立分區策略**,可異於表分區,甚至表非分區也可建立 |
| 分區鍵 | 必須包含表分區鍵 (前導欄) | 可任意欄位,無須包含表分區鍵 |
| 唯一性約束 | 唯一索引**必須**包含分區鍵 | 可建立不含分區鍵的唯一索引 |
| 分區維護影響 | 透明:表分區 DROP/TRUNCATE/MERGE/SPLIT 自動同步索引分區 | 需手動維護:表分區變更必須 UPDATE GLOBAL INDEXES,否則索引失效 (UNUSABLE) |
| 查詢裁剪 | 自動配合表分區裁剪 | 需查詢條件包含索引分區鍵才能裁剪 |
| 適用場景 | 資料倉庫、時間序列資料、大量分區維護作業 | OLTP 高併發、需跨分區唯一性、非分區表加速特定查詢 |
CREATE INDEX idx_local_simple ON part_table(col1) LOCAL;
CREATE INDEX idx_local_store ON part_table(col1)
LOCAL STORE IN (ts_idx1, ts_idx2, ts_idx3, ts_idx4); -- 數量必須等於表分區數
僅適用 Hash 或 Composite 分區表。
CREATE INDEX idx_local_detail ON part_table(col1)
LOCAL (
PARTITION p1 TABLESPACE ts_idx1,
PARTITION p2 TABLESPACE ts_idx2,
PARTITION p3 TABLESPACE ts_idx3
);
支援子分區、儲存參數、LOGGING/NOLOGGING 等細節。
CREATE INDEX idx_global ON part_table(col2)
GLOBAL PARTITION BY RANGE (col2) (
PARTITION g1 VALUES LESS THAN (1000) TABLESPACE ts_g1,
PARTITION g2 VALUES LESS THAN (2000) TABLESPACE ts_g2,
PARTITION g3 VALUES LESS THAN (MAXVALUE) TABLESPACE ts_g3
);
分區鍵 col2 可與表分區鍵完全無關。
執行表分區 DDL 時,**必須**加上此子句同步全域索引,否則索引標記為 UNUSABLE,後續查詢將報錯或全表掃描。
-- 正確:同步維護全域索引
ALTER TABLE part_table DROP PARTITION p_old UPDATE GLOBAL INDEXES;
-- 錯誤:全域索引將失效
ALTER TABLE part_table DROP PARTITION p_old;
效能代價:UPDATE GLOBAL INDEXES 會掃描全域索引所有分區清理已刪分區的 ROWID,大表耗時較久,可考慮 ASYNC 模式 (12c+) 延後維護。
LOCAL STORE IN 或逐分區定義。ORA-14039。REBUILD 耗時極長。DBMS_STATS.GATHER_INDEX_STATS(..., GRANULARITY=>'ALL')。