許多 DBA 面對「系統慢」仍盯著緩衝區命中率、資料庫命中率等傳統指標。實則現代調優核心在於 分析等待事件,尤其是 I/O 相關等待——它是影響效能的頭號殺手。透過作業系統層面工具與 Oracle 內部視圖雙重驗證,才能精準定位根因。
# 每 2 秒採樣 10 次
sar -u 2 10
關鍵欄位:
%wio(或 Linux 下的 %system):CPU 等待 I/O 完成的比例。超過 35% 即判定 I/O 瓶頸。%idle:若接近 0,CPU 已滿載。pi(page in)非零 + free 極小 = 記憶體壓力大。對策:SGA 不超過物理記憶體 40-50%;連接數大時啟用 MTS/共用伺服器;打補丁防記憶體洩漏。
OS 層面用 glance、top、topas、ps 找出高 CPU/記憶體進程的 SPID,再映射到 SQL:
SELECT a.username, a.machine, a.program, a.sid, a.serial#,
c.piece, c.sql_text
FROM v$session a, v$process b, v$sqltext c
WHERE b.spid = <OS_SPID>
AND b.addr = a.paddr
AND a.sql_address = c.address(+)
ORDER BY c.piece;
ORDER BY disk_reads DESC 配合 v$sqlarea。| 事件 | 含義 | 對策 |
|---|---|---|
| buffer busy waits / free buffer waits | 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 | 閂鎖競爭 | 專項調優 |
SELECT se.sid, se.serial#, pr.spid, se.username, se.program,
st.event, si.physical_reads
FROM v$session se, v$session_wait st, v$sess_io si, v$process pr
WHERE st.sid = se.sid
AND si.sid = se.sid
AND se.paddr = pr.addr
AND se.sid > 6
AND st.wait_time = 0
AND st.event NOT LIKE '%SQL%'
ORDER BY si.physical_reads DESC;
後續可用 ALTER SYSTEM KILL SESSION 'sid,serial#' 終止異常會話。