現代調優核心已轉向「優化等待」。當應用回報緩慢,DBA 常發現命中率符合文件建議,實際瓶頸多集中於 I/O。本文分享 Unix 環境下從 OS 層面到 Oracle 內部的診斷實戰流程。
工具:sar、vmstat、glance (HP-UX)、topas (AIX)、top (Linux)。
關鍵指標:
%wio (等待 I/O 佔比) > 35% 表示 I/O 瓶頸;%idle 接近 0 表示 CPU 飽和;vmstat pi (page in) 非 0 或 free 記憶體極小,代表記憶體壓力;glance/topas 記憶體使用率 > 80% 需調整。步驟:
ps -ef | grep ora、glance、topas);SELECT a.username, a.machine, a.program, a.sid, a.serial#,
a.status, c.piece, c.sql_text
FROM v$session a, v$process b, v$sqltext c
WHERE b.spid = '<OS_PID>'
AND b.addr = a.paddr
AND a.sql_address = c.address(+)
ORDER BY c.piece;
技巧:將 IN 改寫為 EXISTS,因 Oracle 處理 IN 如 OR,即使有索引也較慢。
SELECT * FROM (
SELECT parsing_user_id, executions, sorts, command_type,
disk_reads, sql_text
FROM v$sqlarea
ORDER BY disk_reads DESC
) WHERE ROWNUM < 10;
核心視圖:v$session_wait。以下腳本找出正在等待且物理讀最高的 Session:
SELECT se.sid, se.serial#, pr.spid, se.username, se.status,
se.terminal, se.program, se.module, se.sql_address,
st.event, st.p1text, si.physical_reads, si.block_changes
FROM v$session se, v$session_wait st, v$sess_io si, v$process pr
WHERE st.sid = se.sid
AND st.sid = si.sid
AND se.paddr = pr.addr
AND se.sid > 6
AND st.wait_time = 0
AND st.event NOT LIKE '%SQL%'
ORDER BY physical_reads DESC;
| Event | 含義 | 對策 |
|---|---|---|
| buffer busy waits / free buffer waits | DBWR 不足 | 增加 DBWR 進程 (db_writer_processes)、調整 db_block_lru_latches、啟用非同步 I/O |
| db file sequential read | 索引讀取 (單區塊) | 優化 SQL、建立適當索引、調大 db_file_multiblock_read_count |
| db file scattered read | 全表掃描 (多區塊) | 同左、避免不必要全掃 |
| latch free | 閂爭用 | 專項調優 (共享池、Library Cache 等) |
v$session_longops 顯示正在執行/已完成的長作業 (如大表掃描、索引建立),每個 Process 完成刷新一次,可即時掌握進度。
OLTP 環境建議關閉並行查詢:
parallel_min_servers = 0
parallel_max_servers = 0
parallel_automatic_tuning = FALSE
並監控 SQL Hint 是否強制並行,必要時移除 Hint。
調優入口:OS 資源 → 等待事件 → 高耗 SQL → 執行計劃 → 索引/統計/參數調整。建立標準化診斷流程與基線,方能快速定位根因並持續優化。