首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 分區表與索引深度解析:策略選擇、本地/全域索引權衡與最佳實踐

     編輯:Oracle 資料庫相關知識

分區三大核心價值

  1. 可用性:單一分區維護 (備份、重建、匯入) 不影響其他分區線上服務。
  2. 維護性:分區級 TRUNCATE, DROP, EXCHANGE, SPLIT, MERGE 秒級完成。
  3. 效能:Partition Pruning (分區剪枝) 只掃描相關分區;Partition-wise Join 減少資料重分發。

表分區策略選擇指南

策略適用場景剪枝條件典型案例
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+)應用控制分區映射—多租戶資料隔離

索引分區:Local vs Global 核心權衡

Local Index (本地索引) — 分區對齊

  • **結構**:每個表分區對應一個索引分區,鍵值範圍天然一致。
  • **類型**:
    • Local Prefixed:索引鍵**包含**分區鍵 (如 CREATE INDEX idx_local ON t(part_col, col2) LOCAL)。
    • Local Non-Prefixed:索引鍵**不包含**分區鍵 (如 CREATE INDEX idx_local ON t(col2) LOCAL)。
  • **優點**:分區維護 (DROP/SPLIT/MERGE) 索引**自動同步**、不可失效;單分區離線不影響其他分區索引可用。
  • **缺點**:唯一鍵/主鍵**必須包含分區鍵** (非前綴無法建 PK/UK);跨分區查詢需掃描多索引分區。

Global Index (全域索引) — 跨分區單一結構

  • **僅支援 Global Prefixed** (索引鍵包含分區鍵前綴)。
  • **優點**:唯一性約束無需包含分區鍵;單一 B-Tree 支援跨分區唯一檢查、OLTP 精準存取。
  • **缺點**:分區維護操作 (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)

實戰案例:Local Non-Prefixed 索引的威力


-- 表按 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 精準定位

分區維護與 Global Index 保護 (12c+)


-- 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 新特性**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved