| 類型 | 特徵 | 定位方式 |
|---|---|---|
| CPU 密集型 | 惡劣程式碼/結構導致高 CPU 佔用 | OS 層面工具 (top, vmstat, AWR) 追蹤至 Session/Module |
| I/O 密集型 | 全表掃描、大量排序、大量更新導致高物理讀取 | 查詢共享池 V$SQLAREA 找出高 Disk Reads SQL |
CPU 瓶頸通常源於應用邏輯,解決方向為「推算下推到資料庫」(高效 SQL、PL/SQL、批次綁定、結果快取);I/O 瓶頸則直接可從資料庫視圖定位具體 SQL。
記錄共享池中所有已解析 SQL 的累積統計 (自首次解析以來)。
EXECUTIONS:執行次數DISK_READS:物理讀取區塊數 (最關鍵指標)BUFFER_GETS:邏輯讀取區塊數SQL_TEXT:SQL 文本 (前 1000 字元)HIT_RATIO = (BUFFER_GETS - DISK_READS) / BUFFER_GETS:緩衝區命中率SELECT executions,
disk_reads,
buffer_gets,
ROUND((buffer_gets - disk_reads) / buffer_gets, 2) AS hit_ratio,
sql_text
FROM v$sqlarea
WHERE executions > 0
AND buffer_gets > 0
AND (buffer_gets - disk_reads) / buffer_gets < 0.80
ORDER BY 4 DESC;
SELECT sql_text,
executions,
ROUND(disk_reads / executions, 2) AS reads_per_run,
disk_reads,
buffer_gets,
ROUND((buffer_gets - disk_reads) / buffer_gets, 2) AS hit_ratio
FROM v$sqlarea
WHERE executions > 0
AND buffer_gets > 0
AND (buffer_gets - disk_reads) / buffer_gets < 0.80
ORDER BY reads_per_run DESC;
reads_per_run 直接反映單次執行 I/O 成本,排序後最耗資源的 SQL 置頂。Executions=2, Disk_Reads=6, Buffer_Gets=19, Hit_Ratio=0.68
SQL: SELECT ... FROM ... WHERE pk = :b1 -- 唯一索引查詢
Executions=2, Disk_Reads=3625, Buffer_Gets=178777, Hit_Ratio=0.98
SQL: 五表連接,其中一表錯誤全表掃描
DISK_READS / EXECUTIONS (單次執行物理讀) — 直接反映 I/O 成本。BUFFER_GETS (邏輯讀) — 反映 CPU/記憶體壓力;EXECUTIONS — 識別高頻 SQL。EXECUTIONS > 0 AND BUFFER_GETS > 0 避免除零。EXPLAIN PLAN、檢查索引、統計資訊、考慮 SQL Profile / Baseline / 重寫。定位高負載 SQL 只是第一步;真正調校在於理解執行計畫、統計資訊鮮度、索引設計、資料分佈與業務邏輯的匹配度。