資料庫設計階段是效能調優 ROI 最高的時機。本文從邏輯結構(表、索引、叢集、反正規化)與物理結構(磁碟 I/O 平行、動態擴展控制)兩大維度,提供系統化優化策略。
一、邏輯結構優化
1. 表設計:正規化與反正規化平衡
- 基準:滿足 3NF 確保一致性、完整性。
- 痛點:過度正規化導致多表連接、掃描大表取少量資料。
- 反正規化手段:
- 水平分割:依範圍/雜湊分區,提升單表查詢速度,應用需處理多表統計。
- 垂直分割:高頻欄位與低頻欄位分表,減少區塊寬度,單次 I/O 讀更多行。
- 保留冗余欄位:避免頻繁連接,適用較少變動欄位。
- 增加衍生欄位:預先計算彙總值,加速報表查詢。
- 原則:頻繁讀少寫 → 物理反正規化;頻繁寫少讀 → 物理正規化。
2. 索引與叢集
- 索引:B*Tree 映射邏輯值→ROWID,大幅加速高選擇性查詢。避免在高頻 DML 欄位建索引(重組成本)。大表建議分區索引。
- 叢集:共同鍵值將多表資料混合儲存同一區塊,一次 I/O 取多表資料。適用固定連接模式的主從表。
- 表與索引分離存放:不同表空間、不同物理磁碟,消除 I/O 競爭。
二、物理結構優化
1. 磁碟 I/O 平行化
- Oracle 自動平行:表與索引在不同物理結構時,索引掃描與表存取可平行。
- 人工規劃原則:
- 常連接的表 → 不同表空間/磁碟
- 高頻存取表 → 分散不同磁碟
- 表結構與其索引 → 分離儲存
2. 作業平行化
統計表存取頻率、連接頻率,依上述原則佈局表空間與資料檔,減少系統/使用者進程磁碟競爭。
3. 減少動態擴展開銷
- 動態擴展(Extent 分配、資料檔擴展、表空間增長)會導致線上系統卡頓。
- 對策:建立物件時依樣本資料精算
INITIAL, NEXT, MINEXTENTS,預先分配足夠空間,設定合理增長幅度,達到空間利用率與擴展頻率平衡點。
- 採用本地管理表空間(LMT)+ 自動區段空間管理(ASSM)簡化空間管理。
三、區塊大小與儲存參數決定
DB_BLOCK_SIZE 建庫後不可變(除非重建),依樣本資料列長度決定(常見 8K/16K),目標:減少鏈結列、列遷移,提高磁碟利用率。
- 儲存參數依業務增長趨勢設定,避免頻繁擴展與空間浪費並存。