資料庫設計是應用效能的基石。Oracle 效能優化不僅是 SQL 調優,更始於**邏輯/物理模型設計**。本文系統闡述規範化 (3NF) 與反規範化的權衡、三大反規範化技術 (水平/垂直分割、冗餘欄位、派生欄位) 的適用場景、實作細節與效能影響,幫助架構師在「維護性」與「查詢速度」間做出量化決策。
| 範式 | 核心規則 | 優點 | 潛在代價 |
|---|---|---|---|
| 1NF | 屬性原子性、無重複群 | 消除多值屬性 | — |
| 2NF | 非主鍵完全依賴主鍵 | 消除部分依賴 | 表數量增加 |
| 3NF | 非主鍵不傳遞依賴主鍵 | 消除傳遞依賴、更新異常最小 | **查詢需多表 JOIN、效能下降** |
| BCNF | 每個決定因素都是候選鍵 | 更嚴格的 3NF | 極少實務採用 |
實務中 **3NF 是主流標準**:結構清晰、維護容易、基本滿足業務。但高頻查詢場景下,多表 JOIN 成為瓶頸 → 引入反規範化。
-- 按範圍分割:歷史/當前、地域、租戶
CREATE TABLE orders_2023 PARTITION OF orders FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE orders_2024 PARTITION OF orders FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
-- 原表:用戶核心 + 擴充屬性 (大文本/Blob)
CREATE TABLE user_core (id PK, name, email, phone, status, created_at);
CREATE TABLE user_ext (id PK/FK, bio, avatar, preferences_json, last_login_ip);
-- 訂單表冗餘客戶名稱、電話,避免 JOIN customer 表
CREATE TABLE orders (
id PK, customer_id FK,
customer_name VARCHAR2(100), -- 冗餘
customer_phone VARCHAR2(20), -- 冗餘
amount NUMBER, status VARCHAR2(20)
);
AFTER UPDATE ON customer FOR EACH ROW UPDATE orders SET ... WHERE customer_id = :OLD.id-- 訂單明細表預計算行小計、稅額
CREATE TABLE order_items (
id PK, order_id FK, product_id, qty, unit_price,
line_total NUMBER GENERATED ALWAYS AS (qty * unit_price) VIRTUAL, -- 12c+ 虛擬欄位
tax_amt NUMBER GENERATED ALWAYS AS (qty * unit_price * 0.05) VIRTUAL
);
-- 或實體欄位 + 觸發器/應用維護 (支援索引)
ALTER TABLE order_items ADD (line_total NUMBER);
CREATE INDEX idx_order_items_total ON order_items(line_total);
| 場景特徵 | 推薦技術 | 關鍵判斷指標 |
|---|---|---|
| 表極大 (億級)、明顯時間/地域熱冷 | 水平分割 (分區表/分片) | 單分區 < 5000 萬行、分區鍵 = 90% 查詢條件 |
| 寬表、少數欄位佔 80% 存取 | 垂直分割 | 核心表行寬 < 200 bytes、LOB 欄位分離 |
| 高頻 JOIN、被 JOIN 表極小/極少變 | 冗餘欄位 | 冗餘欄位更新 < 1% 寫入、JOIN 耗時 > 50% 查詢時間 |
| 複雜計算、高頻聚合/篩選 | 派生欄位 (實體+索引) | 計算 CPU > 30% 查詢時間、需索引加速 |
| 以上皆無、標準 OLTP | 堅持 3NF | 維護性優先、JOIN 成本可接受 |
GENERATED ALWAYS AS (expr) VIRTUAL,可收集統計、建立索引 (函數式索引)RESULT_CACHE 模式 / /*+ RESULT_CACHE */ Hint,適用極少變維度表EXPLAIN PLAN、SQL_TRACE、AWR 對比反規範化是「用空間換時間、用複雜度換速度」的經典權衡。**嚴禁盲目反規範化**——每一個冗餘欄位、分割表、派生欄位都必須經過「基線測試 → 效能預估 → 風險評估 → 變更上線 → 持續監控」完整生命週期。在 Oracle 平台上,優先利用分區表、虛擬欄位、物化視圖等原生特性,以最小代價獲得最大效能紅利。