首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

Oracle ASH 實戰指南:從 V$ 視圖到 ASH 報告的性能診斷全流程

     編輯:DB2 教學

Oracle ASH 實戰指南:從 V$ 視圖到 ASH 報告的性能診斷全流程

Active Session History (ASH) 是 Oracle 10g+ 核心性能診斷功能,每秒採樣一次活躍會話狀態,將「當下發生什麼」持久化到內存環形緩衝區並定期刷盤到 AWR。本文通過實戰演示 ASH 報告生成、核心視圖查詢、阻塞場景分析,幫助 DBA 快速定位性能瓶頸。

一、ASH 核心概念

  • 活躍會話:持有 CPU 或正在等待非空閒事件的會話。
  • 採樣頻率:每秒 1 次,極低開銷(<1% CPU)。
  • 數據保留:內存中循環覆蓋(約 1-2 小時),AWR 快照時持久化到 DBA_HIST_ACTIVE_SESS_HISTORY(保留由 AWR 保留期控制)。
  • 核心視圖:
    • V$ACTIVE_SESSION_HISTORY:實時內存採樣數據(最近 1-2 小時)。
    • V$SESSION_WAIT_HISTORY:當前會話最近 10 次等待事件。
    • V$SESSION_WAIT:會話當前等待事件。

二、生成 ASH 報告實戰

1. 腳本位置

$ORACLE_HOME/rdbms/admin/ashrpt.sql

2. 交互式生成步驟

SQL> @?/rdbms/admin/ashrpt.sql
-- 選擇報告類型:html(推薦)或 text
-- 輸入開始時間(格式:HH:MI,如 13:10)
-- 輸入持續分鐘數(如 10,或 -10 表示前 10 分鐘)
-- 報告生成在當前目錄:ashrpt_1_1310_1320.html

3. 報告核心解讀區塊

  • Top Events:等待事件佔比排序,直觀定位瓶頸(如 db file sequential read、log file sync、enq: TX - row lock contention)。
  • Top SQL:消耗資源最多的 SQL_ID,配合 DBA_HIST_SQLTEXT 定位具體語句。
  • Top Sessions:最活躍的會話 SID/SERIAL#。
  • Top Blocking Sessions:阻塞鏈分析,直接看到誰阻塞了誰。
  • Activity Over Time:時間維度的活躍度熱力圖。

三、實戰案例:模擬阻塞與 ASH 定位

1. 構建阻塞場景

-- 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;
-- 掛起,等待行鎖

2. 即時視圖定位

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)。

3. 生成 ASH 報告覆蓋該時段

報告中 Top Blocking Sessions 區塊將清晰列出阻塞鏈、持續時間、受影響會話數,Top Events 突出显示 enq: TX - row lock contention。

四、ASH 進階查詢技巧

1. 歷史時段 Top SQL

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;

2. 特定 SQL 的執行計劃變更

SELECT plan_hash_value, COUNT(*)
FROM dba_hist_active_sess_history
WHERE sql_id = 'abc123'
GROUP BY plan_hash_value
ORDER BY COUNT(*) DESC;

3. 等待事件趨勢

SELECT event, COUNT(*)
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/1440  -- 最近 10 分鐘
GROUP BY event
ORDER BY COUNT(*) DESC;

五、ASH vs AWR vs ADDM vs Metric Manager

工具粒度數據源適用場景
ASH秒級內存採樣實時診斷、間歇性問題、會話級分析
AWR小時級ASH 持久化+統計歷史趨勢、容量規劃、整體負載剖析
ADDM快照級AWR 自動分析自動發現頂層問題、給出建議
Metric Manager分鐘級服務器指標閾值告警、基線比較、儀表盤展示

六、總結

ASH 是 Oracle 性能診斷的「顯微鏡」,秒級採樣捕捉瞬時抖動、阻塞、熱點 SQL。掌握 ashrpt.sql 生成報告、核心 V$ 視圖即時查詢、歷史表趨勢分析三板斧,配合 AWR/ADDM 宏觀視角,構建完整診斷體系。記住:**先看 Top Events 定方向,再查 Top SQL/Blocking Sessions 定具體對象,最後落實到具體業務代碼優化。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved