TRUNCATE, DROP, EXCHANGE, SPLIT, MERGE 秒級完成。| 策略 | 適用場景 | 剪枝條件 | 典型案例 |
|---|---|---|---|
| Range | 時間序列、連續數值區間 | WHERE dt >= '2024-01' AND dt < '2024-02' | 交易流水、日誌、帳單 |
| List | 離散值、業務代碼 | WHERE region IN ('TW','HK') | 地區、幣別、狀態碼 |
| Hash | 均勻分散、無明顯篩選欄位 | 等值連接 JOIN ON hash_col | 大型明細表、去熱點 |
| Composite (Range-Hash/List) | 多維度剪枝 + 平行處理 | 時間 + 區域雙重剪枝 | 電信 CDR、零售 POS |
| Interval (11g+) | 自動建立 Range 分區 | 同上 | 避免忘記加分區導致 ORA-14400 |
| Reference (11g+) | 父子表同步分區 | FK 關聯欄位 | 訂單/訂單明細 |
| System (12c+) | 應用控制分區映射 | — | 多租戶資料隔離 |
CREATE INDEX idx_local ON t(part_col, col2) LOCAL)。CREATE INDEX idx_local ON t(col2) LOCAL)。EXCHANGE, SPLIT, MOVE) 導致 Global Index **UNUSABLE**,需 UPDATE GLOBAL INDEXES 子句或事後 REBUILD —— **資料倉庫大忌**。
START
│
├─ 需要 PK/UK 且不含分區鍵? → YES → Global Index (必要代價)
│
├─ 資料倉庫 / 大量分區維護 (EXCHANGE/SPLIT)? → YES → Local Index (首選)
│
├─ OLTP 高併發精準存取? → 考慮 Global Index (但評估維護窗口)
│
└─ 單表查詢、非分區鍵過濾? → Local Non-Prefixed 可行 (如按 B 查詢,分區鍵為 A)
-- 表按 A 範圍分區
CREATE TABLE sales (
sale_date DATE, -- 分區鍵
cust_id NUMBER,
amount NUMBER
) PARTITION BY RANGE (sale_date) ...;
-- 本地非前綴索引:僅含 cust_id
CREATE INDEX idx_sales_cust ON sales(cust_id) LOCAL;
-- 查詢:特定客戶近期交易
SELECT * FROM sales WHERE cust_id = 12345 AND sale_date >= SYSDATE-30;
-- 優化器可:1. Partition Pruning 只掃描近期分區 2. 該分區內用 idx_sales_cust 精準定位
-- 12c 起支援 UPDATE GLOBAL INDEXES (非同步維護,低鎖)
ALTER TABLE sales SPLIT PARTITION p_2023
AT (DATE '2024-01-01')
INTO (PARTITION p_2023, PARTITION p_2024)
UPDATE GLOBAL INDEXES; -- 關鍵字!
-- 或事後非同步重建 (11g+)
ALTER INDEX global_idx REBUILD PARTITION ... ONLINE;
**分區策略決定架構上限,索引類型決定維護下限**。資料倉庫 **Local Prefixed 為主、Non-Prefixed 輔**;OLTP **Global Index 精準存取 + UPDATE GLOBAL INDEXES 降低維護痛點**。12c+ 參考分區、自動分區、間隔分區大幅降低運維負擔,**新專案優先評估 19c/21c 新特性**。