Active Session History (ASH) 是 Oracle 10g+ 核心性能診斷功能,每秒採樣一次活躍會話狀態,將「當下發生什麼」持久化到內存環形緩衝區並定期刷盤到 AWR。本文通過實戰演示 ASH 報告生成、核心視圖查詢、阻塞場景分析,幫助 DBA 快速定位性能瓶頸。
DBA_HIST_ACTIVE_SESS_HISTORY(保留由 AWR 保留期控制)。V$ACTIVE_SESSION_HISTORY:實時內存採樣數據(最近 1-2 小時)。V$SESSION_WAIT_HISTORY:當前會話最近 10 次等待事件。V$SESSION_WAIT:會話當前等待事件。$ORACLE_HOME/rdbms/admin/ashrpt.sql
SQL> @?/rdbms/admin/ashrpt.sql
-- 選擇報告類型:html(推薦)或 text
-- 輸入開始時間(格式:HH:MI,如 13:10)
-- 輸入持續分鐘數(如 10,或 -10 表示前 10 分鐘)
-- 報告生成在當前目錄:ashrpt_1_1310_1320.html
DBA_HIST_SQLTEXT 定位具體語句。-- Session 1
SQL> UPDATE t SET name='s' WHERE id=1;
1 row updated.
-- 未提交,持有行鎖
-- Session 2
SQL> UPDATE t SET name='d' WHERE id=1;
-- 掛起,等待行鎖
SQL> SELECT sid, event, blocking_session, seconds_in_wait
2 FROM v$session_wait
3 WHERE event NOT LIKE 'SQL*Net%' AND event NOT LIKE '%idle%';
SID EVENT BLOCKING_SESSION SECONDS_IN_WAIT
--- ------------------------------ ---------------- ---------------
21 enq: TX - row lock contention 143 15
瞬間定位:SID 21 被 SID 143 阻塞,等待行鎖 (TX)。
報告中 Top Blocking Sessions 區塊將清晰列出阻塞鏈、持續時間、受影響會話數,Top Events 突出显示 enq: TX - row lock contention。
SELECT sql_id, COUNT(*) samples, ROUND(COUNT(*)/60, 2) avg_active_sessions
FROM dba_hist_active_sess_history
WHERE sample_time BETWEEN SYSDATE-1/24 AND SYSDATE
GROUP BY sql_id
ORDER BY samples DESC
FETCH FIRST 10 ROWS ONLY;
SELECT plan_hash_value, COUNT(*)
FROM dba_hist_active_sess_history
WHERE sql_id = 'abc123'
GROUP BY plan_hash_value
ORDER BY COUNT(*) DESC;
SELECT event, COUNT(*)
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/1440 -- 最近 10 分鐘
GROUP BY event
ORDER BY COUNT(*) DESC;
| 工具 | 粒度 | 數據源 | 適用場景 |
|---|---|---|---|
| ASH | 秒級 | 內存採樣 | 實時診斷、間歇性問題、會話級分析 |
| AWR | 小時級 | ASH 持久化+統計 | 歷史趨勢、容量規劃、整體負載剖析 |
| ADDM | 快照級 | AWR 自動分析 | 自動發現頂層問題、給出建議 |
| Metric Manager | 分鐘級 | 服務器指標 | 閾值告警、基線比較、儀表盤展示 |
ASH 是 Oracle 性能診斷的「顯微鏡」,秒級採樣捕捉瞬時抖動、阻塞、熱點 SQL。掌握 ashrpt.sql 生成報告、核心 V$ 視圖即時查詢、歷史表趨勢分析三板斧,配合 AWR/ADDM 宏觀視角,構建完整診斷體系。記住:**先看 Top Events 定方向,再查 Top SQL/Blocking Sessions 定具體對象,最後落實到具體業務代碼優化。**