Oracle 調優是系統性工程,涵蓋作業系統層面、I/O 架構、SQL 執行計畫、排序記憶體、儲存參數等多個維度。本文依循「由外而內、由粗到細」的邏輯,系統梳理核心調優知識點與實戰策略。
Oracle 不在真空中運行。若 CPU、記憶體、網路出現瓶頸,任何資料庫層面的調整皆事倍功半。
| 資源 | 瓶頸徵兆 | 對策 |
|---|---|---|
| CPU | 執行佇列長度 > CPU 核心數 | 增加 CPU、關閉 Parallel Query、優化高耗 CPU SQL |
| 記憶體 | 發生記憶體分頁 | 增加實體記憶體、縮減 SGA、關閉 MTS (共享伺服器) |
| 網路 | 大量 Net8 通訊延遲 | 優化應用端連線池、減少往返、啟用 SDU/TDU 調整 |
工具:vmstat、sar、top、glance (HP-UX) 監控 OS 層面指標。
核心原則:磁碟 I/O 比記憶體慢 10,000 倍。若應用常以索引範圍掃描讀取連續鍵值,將表資料按主鍵/索引鍵順序物理重排,可將隨機 I/O 轉為循序 I/O,大幅降低區塊讀取次數。
WHERE col LIKE 'prefix%' 或範圍條件,回傳多筆連續鍵值。同樣查詢 100 筆資料:
查詢 DBA_INDEXES.CLUSTERING_FACTOR:
BLOCKS (表區塊數) → 資料與索引順序一致,無需重排。NUM_ROWS (表列數) → 順序嚴重不一致,重排效益極大。CREATE TABLE ... AS SELECT ... ORDER BY pk_col (CTAS)DBMS_REDEFINITION 線上重組。INDEX Hint 強制走索引。ALTER TABLE ... CACHE;8i+ 強制置入 KEEP Buffer Pool,避免被淘汰。這四條規則涵蓋 90% SQL 調優場景,無需深究內部機制即可見效。
ORDER BY、GROUP BY、CREATE INDEX、索引不足導致 Merge Sort Join。SORT_AREA_SIZE (PGA);共享伺服器用 LARGE_POOL。SORT_AREA_SIZE、SORT_AREA_RETAINED_SIZE。10g+ 建議啟用 PGA_AGGREGATE_TARGET 自動管理。高 DML (INSERT/UPDATE/DELETE) 系統的效能關鍵在於區塊重用效率。
| 參數 | 控制行為 | 高值效果 | 低值效果 |
|---|---|---|---|
| PCTFREE | 區塊保留空間供更新膨脹 (Unlink 門檻) | 預留更多空間,減少 Row Migration/Chaining | 空間利用率高,但易產生鏈列 |
| PCTUSED | 區塊使用率降至此值才回 Freelist (Relink 門檻) | 積極回收空間,但易造成「死區塊」(空間不足放不下新列) | 區塊幾乎清空才回收,減少 I/O,利於高載入 |
| FREELISTS | 並發插入的 Freelist 數量 | 降低 Segment Header 爭用 | 高併發下產生 Contention |
| FREELIST GROUPS | RAC/Parallel Server 實例數 | 僅 RAC 環境有效 | - |
PCTUSED 設為能容納「至少一列」的最低值,避免死區塊。PCTFREE 過低或 DB_BLOCK_SIZE 過小 (LONG/RAW 大欄位除外)。FREELISTS = 最大並發插入 Session 數 (如 20)。FREELIST GROUPS 忽略。調優無銀彈,但有章法:先保障 OS 資源 → 降低 I/O (重排/分區/索引) → 優化 SQL (四大法則) → 記憶體排序 → 微調儲存參數。每層突破都能帶來可量化的效能提升。