效能問題源頭眾多,遵循「由外而內、由粗到細」原則:
| 資源 | 關鍵指標 | 調優方向 |
|---|---|---|
| CPU | Run Queue Length > CPU 核心數 | 增加 CPU、綁定關鍵進程、Kill 異常高佔用進程 |
| 記憶體 | Page-in/Page-out 率、Swap 使用率 | 增加物理記憶體、調整 SGA/PGA、減少磁碟排序 |
| 網路 | 帶寬使用率、封包重傳率、延遲 | 升級網卡/交換機、避免串聯 >2 個 Hub、啟用 SDU 優化 |
| I/O 子系統 | 平均服務時間、佇列長度、吞吐量 | RAID 10、ASM、分離資料/索引/重做/歸檔至不同磁碟組 |
| 參數 | 建議調整方向 | 影響面 |
|---|---|---|
bufpages / nbuf | 啟用動態緩衝區分配 | 檔案系統緩存效率 |
dbc_max_pct / dbc_min_pct | 提高動態緩衝區佔物理記憶體上限/下限 | 讀寫命中率 |
desfree / lotsfree / minfree | 提高啟動/解除/停止換頁的記憶體門檻 | 系統穩定性、可用記憶體 |
fs_async | 啟用非同步 I/O | CPU 與磁碟並行度 |
maxdsiz / maxdsiz_64bit | 加大最大資料段大小 | 大型 SGA/PGA 分配 |
maxssiz / maxssiz_64bit | 加大最大堆疊段 | 深度遞歸/大型 PL/SQL |
maxtsiz / maxtsiz_64bit | 調整最大程式碼段 | 共享庫載入 |
shmem / shmmax | 啟用共享記憶體、設定最大共享段 ≥ SGA 目標值 | SGA 分配成功與否 |
timeslice | 降低時間片 | 減少 I/O 等待佔用 CPU、提高多任務響應 |
unlockable_mem | 增加不可鎖記憶體 | 擴大可換頁/交換空間 |
REBUILD INDEX 消除碎片;TRUNCATE 可同步清除索引碎片。(+) 外聯結,避免 NOT IN: 外聯結可利用索引,NOT IN 易導致全掃。SORT_AREA_SIZE: 記憶體排序不足會落盤至臨時表空間,導致 free buffer waits 飆升。FREELISTS / FREELIST GROUPS:針對高並發插入表增加自由鏈表組,減少緩衝區頭部爭用。PCTFREE / PCTUSED:精確控制區塊進出自由鏈表閾值,平衡空間利用率與並發插入效能。| 參數 | 角色 | 調優建議 |
|---|---|---|
SGA_TARGET / SGA_MAX_SIZE | 系統全域區總量 | 啟用 ASMM(自動共享記憶體管理),設為物理記憶體 40%-60% |
DB_CACHE_SIZE (舊 db_block_buffers) | 資料緩衝區 | 越大命中率越高,監控 V$DB_CACHE_ADVICE |
SHARED_POOL_SIZE | 共享池(Library Cache + Dictionary Cache) | 避免 ORA-04031,監控 V$SHARED_POOL_ADVICE |
LOG_BUFFER | 重做日誌緩衝區 | 大批次 DML 環境適度增大(如 10-50MB) |
PGA_AGGREGATE_TARGET | 程式全域區總量(排序、雜湊、游標) | 啟用自動 PGA 管理,設為物理記憶體 20%-30% |
SORT_AREA_SIZE | 手動排序區(舊版) | 若未用自動 PGA,依最大排序量設定 |
PROCESSES | 最大連接進程數 | ≥ 預估峰值連接數 + 背景進程 + 保留 |
DB_BLOCK_SIZE | 資料庫區塊大小 | **建庫時一次決定**(8K/16K/32K),不可變更;OLTP 建議 8K,DSS 建議 16K/32K 減少 I/O |
OPEN_CURSORS | 每 Session 最大開啟游標 | 預設 300,視應用調整(500-2000) |
DB_WRITER_PROCESSES (舊 dbwr_io_slaves) | DBWR 寫入進程數 | CPU 核心數 ≥ 8 時設為 2-4,配合非同步 I/O |
Oracle 效能調優是系統工程,非單一參數即可包治百病。堅持「測量 → 分析 → 優化 → 驗證」科學循環,兼顧硬體、OS、SQL、實例參數四大維度,方能構建穩定高效的資料庫服務。