一、資料庫層面優化
1.1 Control File 設定
- 多重控制檔 (
CONTROL_FILES 指定 ≥2 個),鏡像至不同磁碟,並備份至安全位置。
1.2 Tablespace 與 Datafile 設計
- 表與索引分置不同 Tablespace (資料/索引表空間分離),避免同磁碟 I/O 爭用。
- 相似記錄大小的表歸屬同一 Tablespace,優化儲存參數減少跨 Extent。
- Datafile 分散不同物理裝置避免 I/O 衝突。
1.3 Redo Log 設計
- 大小影響 Checkpoint 頻率:過小導致頻繁 Checkpoint 衝擊效能,應避開尖峰時段。
- Archive 模式下適當增加 Log Group 數降低歸檔頻率。
- Archive 目的地置於高速磁碟。
1.4 Rollback Segment 設計
- 數量滿足最大併發交易需求。
- 大小容納最大交易的 Rollback Entry。
1.5 記憶體結構平衡
- 調整 DB Buffer Cache、Shared Pool、Redo Log Buffer、PGA (Sort Area) 大小平衡。
二、應用程式層面優化
2.1 統一 SQL 寫法
相同 SQL 文本可共用 Shared Pool 解析樹,減少 Hard Parse。
2.2 選擇高效 SQL 寫法
同一結果多種寫法,選擇可讀且執行計畫優者。
2.3 明確列出欄位名稱
避免 SELECT *,減少 WORK AREA I/O。
2.4 复合索引欄位順序
索引 (AGE, ADDRESS):
WHERE AGE=28 AND ADDRESS='BEIJING' → 索引有效
WHERE AGE=28 → 索引有效
WHERE ADDRESS='BEIJING' → 索引失效 (非前導欄位)
2.5 WHERE 條件撰寫禁忌
- 索引欄勿用函數:
SUBSTR(TEL,2,2)='88' → TEL LIKE '88%'
- 索引欄勿用
NOT/<>:導致 Full Scan。
- 索引欄勿用
IS NULL:B*Tree 索引不存 NULL。
- 索引欄勿運算:
SAL*12 > 100000 → 索引失效。
結語
上述方法源自實務經驗,能有效提升 Oracle 資料庫與應用程式效能,供同好參考。