Oracle 性能調優非單一工具可盡,需構建 **「作業系統層 → 數據庫內核層 → SQL 應用層 → 管理平台層」** 立體診斷體系。五大核心工具各司其職,互為補充。
| 領域 | 關鍵視圖 | 核心用途 |
|---|---|---|
| 實例與會話 | V$INSTANCE, V$DATABASE | 實例狀態、數據庫模式、角色、啟動時間 |
| V$SESSION, V$SESSION_WAIT, V$SESSION_EVENT | 當前會話、等待事件、歷史等待統計 — **定位會話級瓶頸首選** | |
| V$PROCESS, V$BGPROCESS | 前台/後台進程映射,關聯 OS PID 排查系統層資源爭用 | |
| 內存與 SGA | V$SGA, V$SGASTAT, V$SGAINFO | SGA 組件大小、自由內存、調整歷史 |
| V$BH, V$BUFFER_POOL_STATISTICS | 緩存命中率、LRU 鏈狀態、對象在緩存分布 — **調優 db_cache_size 關鍵** | |
| V$LIBRARYCACHE, V$ROWCACHE | 共享池/字典緩存命中率、重載率、釘住對象 — **調優 shared_pool_size 關鍵** | |
| V$PGASTAT, V$PROCESS_MEMORY | PGA 聚合統計、進程級內存分佈 — **調優 pga_aggregate_target 關鍵** | |
| I/O 與存儲 | V$FILESTAT, V$TEMPSTAT, V$DATAFILE | 數據文件/臨時文件讀寫延遲、吞吐、熱點文件 — **I/O 瓶頸定位** |
| V$ASM_DISK, V$ASM_DISKGROUP | ASM 磁盤組平衡度、磁盤性能、重平衡進度 | |
| V$IOSTAT_FILE, V$IOSTAT_FUNCTION | 11g+ 統一 I/O 統計,按功能/文件類型劃分延遲分布 | |
| SQL 與優化器 | V$SQL, V$SQLAREA, V$SQLSTATS | 游標級/語句級執行統計:解析次數、執行次數、Elapsed Time、CPU Time、Buffer Gets、Disk Reads、Rows Processed — **Top SQL 發掘源頭** |
| V$SQL_PLAN, V$SQL_PLAN_STATISTICS_ALL | 執行計劃與實時統計 (A-Rows, A-Time, Buffers) — **計劃驗證金標準** | |
| V$SQL_OPTIMIZER_ENV | SQL 執行時優化器環境參數 (OPTIMIZER_MODE, _OPTIMIZER_* 隱藏參數) | |
| V$SQL_BIND_CAPTURE, V$SQL_BIND_DATA | 綁定變量窺探值 — **解決綁定變量窺探失效/計劃翻轉** | |
| 鎖與併發 | V$LOCK, V$LOCKED_OBJECT | 當前鎖持有/等待、阻塞鏈 — **死鎖/阻塞實時排查** |
| V$ENQUEUE_STAT, V$ENQUEUE_STATISTICS | 鎖類型級等待統計 (TM, TX, HW, ST 等) | |
| V$SESSION_BLOCKERS (12c+) | 直接顯示阻塞會話鏈,簡化阻塞排查 |
SELECT * FROM (
SELECT sql_id, executions, buffer_gets, buffer_gets/executions gets_per_exec,
cpu_time/1e6 cpu_sec, elapsed_time/1e6 ela_sec,
sql_text
FROM v$sqlstats
WHERE executions > 0
ORDER BY buffer_gets DESC
) WHERE ROWNUM <= 10;
數據庫運行於 OS 之上,OS 瓶頸 (CPU 飽和、內存交換、I/O 隊列、網絡擁塞) 直接投射為數據庫性能劣化。**必備工具鏈** :
vmstat 1 10 — 內存/交換/CPU/上下文切換/中斷 實時流iostat -xmt 1 — 磁盤設備級利用率 (%util)、服務時間 (await)、隊列長度、吞吐mpstat -P ALL 1 — 每 CPU 核心利用率,識別單核瓶頸/中斷風暴pidstat -p -d -u -w 1 — Oracle 進程級 CPU/內存/I/O/上下文切換perf top -p — 函數級熱點分析 (需內核支持)sar -n DEV 1 / sar -n TCP,ETCP 1 — 網絡接口/TCP 重傳/錯誤統計-- 會話級啟用 (含綁定變量、等待事件、計劃統計)
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
-- 或使用 DBMS_MONITOR (推薦,10g+)
EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id => 123, serial_num => 456, waits => TRUE, binds => TRUE, plan_stat => 'ALL_EXECUTIONS');
-- 執行目標 SQL...
-- 關閉
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id => 123, serial_num => 456);
| 欄位 | 含義 | 異常信號 |
|---|---|---|
| count | 解析/執行/獲取次數 | Parse/Execute 比例高 → 繼續解析 (未用綁定變量/游標未共享) |
| cpu | CPU 時間 (秒) | CPU 高但 Elapsed 低 → 純計算密集;CPU 低 Elapsed 高 → 等待主導 |
| elapsed | 墻鐘時間 (秒) | 總耗時基準 |
| disk | 物理讀塊數 | Disk/Query 高 → 緩存未命中/全表掃描/索引失效 |
| query | 一致性獲取 (邏輯讀) | Query 高 → 訪問路徑低效 (索引範圍掃描過廣/嵌套循環過深) |
| current | 當前塊獲取 (DML 修改) | Current 高 → 大量 DML/鎖爭用 |
| rows | 處理行數 | Rows=0 但 Query 高 → 過濾條件極不選擇性 |
# 1. 查詢 trace 文件路徑
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
# 2. 或查詢會話 tracefile
SELECT tracefile FROM v$process p JOIN v$session s ON p.addr = s.paddr WHERE s.sid = 123;
# 3. 運行 tkprof
tkprof ora_ora_12345.trc output.txt explain=user/pass sys=no sort=prsela,exeela,fchela
這是 Oracle 10g+ 核心差異化優勢,**無需額外授權** (屬於 Diagnostics Pack,EE 需單獨購買授權)** 。
SELECT event, COUNT(*) samples, ROUND(COUNT(*)/SUM(COUNT(*)) OVER()*100,2) pct
FROM v$active_session_history
WHERE sample_time > SYSDATE - INTERVAL '15' MINUTE
AND session_state = 'WAITING'
GROUP BY event
ORDER BY samples DESC;
工具無優劣,唯**場景與組合**決定成效。資深 DBA 的核心競爭力在於:**熟練掌握各工具數據源、采樣頻率、粒度、保留策略、授權依賴,並能在壓力下快速組合定位根因**。建議建立個人「調優知識庫」,沉澱常用查詢腳本、TKPROF 分析模板、AWR 關鍵章節解讀筆記,實現從「會用工具」到「駕馭工具」的躍升。