Oracle SQL 調優雖博大精深,但 90% 的工作圍繞三大目標展開,掌握這些原則即可解決多數效能問題:
全表掃描產生大量 I/O,拖垮整體效能。判斷標準:
常見手段:建立 B-tree、Bitmap 或 Function-based 索引;必要時用 Hint 強制索引;小表全表掃描則建議置入 KEEP 池(Oracle 8+)或 ALTER TABLE ... CACHE(Oracle 7)。
多索引可選時,需人工檢查執行計畫,確保 Oracle 選用最佳索引(含 Bitmap、Function-based 索引)。
Nested Loop、Hash Join、Sort-Merge Join 各有適用場景,需根據資料量、索引、排序需求選擇最優方案。
排序發生於 ORDER BY、GROUP BY、CREATE INDEX、合併連結等場景。每個 Session 獲私有排序區域:
sort_area_size 決定若排序超出 sort_area_size,溢寫至 TEMP 表空間進行磁碟排序,**速度慢約 14,000 倍**,且消耗暫存空間、緩衝池,引發 free buffer waits 連鎖反應。
| 參數 | 說明 | 建議 |
|---|---|---|
sort_area_size | 每個排序操作的記憶體上限 | 依最大排序任務評估,平衡記憶體浪費與磁碟排序風險 |
sort_area_retained_size | 排序完成後保留的記憶體 | 通常設為 sort_area_size 同值或略小 |
V$SORT_USAGE、V$SESSION_WAIT 發現磁碟排序。sort_area_size(Session 層級 ALTER SESSION)。ORDER BY、DISTINCT、UNION(改用 UNION ALL)。ORDER BY 欄位若有索引,Oracle 可直接按索引順序讀取。SQL 調優無銀彈,但聚焦「消除不必要全表掃描、最佳化索引與 JOIN、控制排序溢寫」三大面向,配合 SORT_AREA_SIZE 精細調校,即能解決絕大多數效能瓶頸。