許多 DBA 錯誤地直接調參數,卻忽略伺服器資源瓶頸。正確順序:
若 CPU 排隊長度超過核心數、或記憶體發生 paging/swapping,任何 SQL 調優效果皆有限。
| 資源 | 症狀 | 常用工具 | 對策 |
|---|---|---|---|
| CPU | Run queue > CPU cores | vmstat, mpstat, top, sar | 增加 CPU、關閉 Parallel Query、優化高耗 SQL |
| 記憶體 | Page-in/out 頻繁、swap used 高 | free, vmstat, glance | 加記憶體、縮減 SGA、關閉 MTS |
| 磁碟 I/O | iowait > 20%、svc_t > 20ms | iostat, sar -d | RAID 重規劃、ASM 磁碟組平衡、增加快取 |
| 網路 | Net8 封包延遲、重傳率高 | netstat, tcpdump | 啟用 SDU/TDU、檢查防火牆、考慮 RAC 私網 |
當查詢透過索引範圍掃描讀取大量連續鍵值時,若表資料物理順序與索引順序一致(CLUSTERING_FACTOR 接近區塊數),單次多區塊讀取即可滿足數百筆資料,避免大量單區塊隨機 I/O。
-- 未重排:100 筆資料分散在 100 個區塊 → 100 次單區塊讀取
-- 重排後:100 筆資料集中在 2-3 個區塊 → 1 次索引讀取 + 2-3 次多區塊讀取
-- I/O 減少 97% 以上
DBA_INDEXES.CLUSTERING_FACTOR 與 DBA_TABLES.BLOCKS 差距。CREATE TABLE new_t AS SELECT * FROM old_t ORDER BY pk_col;(CTAS)重建表。DBMS_REDEFINITION 聯機重組,業務零停機。ALTER TABLE small_t CACHE;(7)或 ALTER TABLE small_t STORAGE (BUFFER_POOL KEEP);(8+)。LEADING、USE_NL、USE_HASH 強制指定。SORT_AREA_SIZE(專用連線)或 PGA_AGGREGATE_TARGET(自動 PGA 管理)決定記憶體排序上限。V$SORT_USAGE、V$SQL_WORKAREA_ACTIVE 觀察 ONEPASS / MULTIPASS 比例。ORDER BY/GROUP BY、建立索引消除排序。PCTFREE:預留空間給 UPDATE 增長,避免 Row Migration/Chaining。PCTUSED:區塊使用率降至此值才回到 Freelist,供 INSERT 重用。FREELISTS:設為最大併發 INSERT 會話數,減少 Freelist 爭用。FREELIST GROUPS:僅 RAC/Parallel Server 有效,設為實例數。PCTUSED → 空間重用率高、但 I/O 多;低 PCTUSED → 高效能、空間浪費大。依業務取捨。PCTFREE 是否過低或 DB_BLOCK_SIZE 過小。調優沒有銀彈,只有「測量 → 分析 → 優化 → 驗證」的科學迭代,才能讓 Oracle 持續發揮最佳效能。