如果您讀了上周五我在墨天輪發表的原創博客文章 - 可視化Oracle性能圖表之“平均活動會話”篇,我想您對Oracle的平均活動會話一定有所了解,尤其是我從八個維度展現的可視化圖表。在那篇文章的最后我曾提到我的下一篇文章將是可視化Oracle性能圖表之“平均活動會話&邏輯CPU”篇。那么,請讓我娓娓道來。
同理,我們仍然是從八個維度來依次闡述。如果您覺得說來話長,那我們就長話短說。哈哈......
維度目錄列表
- 實時的平均活動會話和邏輯CPU數目
- 最近24小時的平均活動會話和邏輯CPU數目
- 最近7天的平均活動會話和邏輯CPU數目(按每小時間隔)
- 最近7天的平均活動會話和邏輯CPU數目(按每天間隔)
- 最近31天的平均活動會話和邏輯CPU數目(按每小時間隔)
- 最近31天的平均活動會話和邏輯CPU數目(按每天間隔)
- 自定義時間段的平均活動會話和邏輯CPU數目(按每小時間隔)
- 自定義時間段的平均活動會話和邏輯CPU數目(按每天間隔)
實時的平均活動會話和邏輯CPU數目
話不多說,直接上代碼:
-- Average Active Sessions & Logic CPUs in Real Time.
SET LINESIZE 200
SET PAGESIZE 200
COLUMN snap_date_time FORMAT a19
COLUMN stat_name FORMAT a25
COLUMN stat_value FORMAT 999,999.99
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
WITH aas AS
(
SELECT TO_CHAR(end_time, 'yyyy-mm-dd hh24:mi:ss') snap_date_time
, metric_name
, ROUND(value, 2) aas
FROM v$sysmetric_history
WHERE metric_name = 'Average Active Sessions'
AND group_id = 2
),
oscpu AS
(
SELECT stat_name
, value
FROM v$osstat
WHERE stat_name = 'NUM_CPUS'
)
SELECT s.snap_date_time -- the group column
, DECODE(u.stat_name, 'NUM_CPUS', 'Logic CPUs') stat_name -- the series column
, u.value stat_value -- the value column
FROM oscpu u -- "oscpu" has only a row, so using "oscpu" and "aas" to join each other to acquire the column "snap_date_time" of "aas".
, aas s
UNION ALL
SELECT snap_date_time -- the group column
, metric_name stat_name -- the series column
, aas stat_value -- the value column
FROM aas
ORDER BY stat_name DESC
, snap_date_time
;再上圖,

最近24小時的平均活動會話和邏輯CPU數目
SQL代碼如下:
-- Average Active Sessions & Logic CPUs in Last 24 Hours.
SET LINESIZE 200
SET PAGESIZE 200
COLUMN snap_date_time FORMAT a19
COLUMN stat_name FORMAT a25
COLUMN stat_value FORMAT 999,999.99
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
WITH aas AS
(
SELECT snap_id
, dbid
, instance_number
, TO_CHAR(end_time, 'yyyy-mm-dd hh24:mi:ss') snap_date_time
, metric_name
, ROUND(average, 2) aas
FROM dba_hist_sysmetric_summary
WHERE metric_name = 'Average Active Sessions'
AND end_time >= SYSDATE - 1
),
oscpu AS
(
SELECT snap_id
, dbid
, instance_number
, stat_name
, value
FROM dba_hist_osstat
WHERE stat_name = 'NUM_CPUS'
)
SELECT s.snap_date_time -- the group column
, DECODE(u.stat_name, 'NUM_CPUS', 'Logic CPUs') stat_name -- the series column
, u.value stat_value -- the value column
FROM aas s
, oscpu u
WHERE s.snap_id = u.snap_id
AND s.dbid = u.dbid
AND s.instance_number = u.instance_number
UNION ALL
SELECT snap_date_time -- the group column
, metric_name stat_name -- the series column
, aas stat_value -- the value column
FROM aas
ORDER BY stat_name DESC
, snap_date_time
;可視化的圖表為:

最近7天的平均活動會話和邏輯CPU數目(按每小時間隔)
SQL代碼是這樣的:
-- Average Active Sessions & Logic CPUs in Last 7 Days (interval by each hour).
SET LINESIZE 200
SET PAGESIZE 200
COLUMN snap_date_time FORMAT a19
COLUMN stat_name FORMAT a25
COLUMN stat_value FORMAT 999,999.99
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
WITH aas AS
(
SELECT snap_id
, dbid
, instance_number
, TO_CHAR(end_time, 'yyyy-mm-dd hh24:mi:ss') snap_date_time
, metric_name
, ROUND(average, 2) aas
FROM dba_hist_sysmetric_summary
WHERE metric_name = 'Average Active Sessions'
AND end_time >= SYSDATE - 6
),
oscpu AS
(
SELECT snap_id
, dbid
, instance_number
, stat_name
, value
FROM dba_hist_osstat
WHERE stat_name = 'NUM_CPUS'
)
SELECT s.snap_date_time -- the group column
, DECODE(u.stat_name, 'NUM_CPUS', 'Logic CPUs') stat_name -- the series column
, u.value stat_value -- the value column
FROM aas s
, oscpu u
WHERE s.snap_id = u.snap_id
AND s.dbid = u.dbid
AND s.instance_number = u.instance_number
UNION ALL
SELECT snap_date_time -- the group column
, metric_name stat_name -- the series column
, aas stat_value -- the value column
FROM aas
ORDER BY stat_name DESC
, snap_date_time
;那么,對應的圖表如下所示:

最近7天的平均活動會話和邏輯CPU數目(按每天間隔)
具體的SQL查詢代碼如下:
-- Average Active Sessions & Logic CPUs in Last 7 Days (interval by each day).
SET LINESIZE 200
SET PAGESIZE 200
COLUMN snap_date FORMAT a12
COLUMN stat_name FORMAT a25
COLUMN stat_value FORMAT 999,999.99
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
WITH aas_per_hour AS
(
SELECT snap_id
, dbid
, instance_number
, TO_CHAR(end_time, 'yyyy-mm-dd') snap_date
, metric_name
, average
FROM dba_hist_sysmetric_summary
WHERE metric_name = 'Average Active Sessions'
AND end_time >= SYSDATE - 6
),
aas AS
(
SELECT snap_date -- the group column
, metric_name -- the series column
, ROUND(SUM(average)/COUNT(snap_date), 2) aas -- the value column
FROM aas_per_hour
GROUP BY snap_date
, metric_name
),
oscpu AS
(
SELECT snap_id
, dbid
, instance_number
, stat_name
, value
FROM dba_hist_osstat
WHERE stat_name = 'NUM_CPUS'
)
SELECT DISTINCT s.snap_date -- the group column
, DECODE(u.stat_name, 'NUM_CPUS', 'Logic CPUs') stat_name -- the series column
, u.value stat_value -- the value column
FROM aas_per_hour s
, oscpu u
WHERE s.snap_id = u.snap_id
AND s.dbid = u.dbid
AND s.instance_number = u.instance_number
UNION ALL
SELECT snap_date -- the group column
, metric_name stat_name -- the series column
, aas stat_value -- the value column
FROM aas
ORDER BY stat_name DESC
, snap_date
;對應的可視化圖表見下圖:

最近31天的平均活動會話和邏輯CPU數目(按每小時間隔)
完整的SQL代碼詳見下面的查詢語句:
-- Average Active Sessions & Logic CPUs in Last 31 Days (interval by each hour).
SET LINESIZE 200
SET PAGESIZE 200
COLUMN snap_date_time FORMAT a19
COLUMN stat_name FORMAT a25
COLUMN stat_value FORMAT 999,999.99
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
WITH aas AS
(
SELECT snap_id
, dbid
, instance_number
, TO_CHAR(end_time, 'yyyy-mm-dd hh24:mi:ss') snap_date_time
, metric_name
, ROUND(average, 2) aas
FROM dba_hist_sysmetric_summary
WHERE metric_name = 'Average Active Sessions'
AND end_time >= SYSDATE - 30
),
oscpu AS
(
SELECT snap_id
, dbid
, instance_number
, stat_name
, value
FROM dba_hist_osstat
WHERE stat_name = 'NUM_CPUS'
)
SELECT s.snap_date_time -- the group column
, DECODE(u.stat_name, 'NUM_CPUS', 'Logic CPUs') stat_name -- the series column
, u.value stat_value -- the value column
FROM aas s
, oscpu u
WHERE s.snap_id = u.snap_id
AND s.dbid = u.dbid
AND s.instance_number = u.instance_number
UNION ALL
SELECT snap_date_time -- the group column
, metric_name stat_name -- the series column
, aas stat_value -- the value column
FROM aas
ORDER BY stat_name DESC
, snap_date_time
;同理,對應的可視化圖表如下圖所示:

最近31天的平均活動會話和邏輯CPU數目(按每天間隔)
SQL查詢語句如下:
-- Average Active Sessions & Logic CPUs in Last 31 Days (interval by each day).
SET LINESIZE 200
SET PAGESIZE 200
COLUMN snap_date FORMAT a12
COLUMN stat_name FORMAT a25
COLUMN stat_value FORMAT 999,999.99
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
WITH aas_per_hour AS
(
SELECT snap_id
, dbid
, instance_number
, TO_CHAR(end_time, 'yyyy-mm-dd') snap_date
, metric_name
, average
FROM dba_hist_sysmetric_summary
WHERE metric_name = 'Average Active Sessions'
AND end_time >= SYSDATE - 30
),
aas AS
(
SELECT snap_date -- the group column
, metric_name -- the series column
, ROUND(SUM(average)/COUNT(snap_date), 2) aas -- the value column
FROM aas_per_hour
GROUP BY snap_date
, metric_name
),
oscpu AS
(
SELECT snap_id
, dbid
, instance_number
, stat_name
, value
FROM dba_hist_osstat
WHERE stat_name = 'NUM_CPUS'
)
SELECT DISTINCT s.snap_date -- the group column
, DECODE(u.stat_name, 'NUM_CPUS', 'Logic CPUs') stat_name -- the series column
, u.value stat_value -- the value column
FROM aas_per_hour s
, oscpu u
WHERE s.snap_id = u.snap_id
AND s.dbid = u.dbid
AND s.instance_number = u.instance_number
UNION ALL
SELECT snap_date -- the group column
, metric_name stat_name -- the series column
, aas stat_value -- the value column
FROM aas
ORDER BY stat_name DESC
, snap_date
;那么,這個查詢維度的圖表是下面這個樣子:

自定義時間段的平均活動會話和邏輯CPU數目(按每小時間隔)
對應的SQL查詢見下面的代碼:
-- Average Active Sessions & Logic CPUs Custom Time Period (interval by each hour).
SET LINESIZE 200
SET PAGESIZE 200
COLUMN snap_date_time FORMAT a19
COLUMN stat_name FORMAT a25
COLUMN stat_value FORMAT 999,999.99
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
WITH aas AS
(
SELECT snap_id
, dbid
, instance_number
, TO_CHAR(end_time, 'yyyy-mm-dd hh24:mi:ss') snap_date_time
, metric_name
, ROUND(average, 2) aas
FROM dba_hist_sysmetric_summary
WHERE metric_name = 'Average Active Sessions'
AND (end_time BETWEEN TO_DATE(:start_date, 'yyyy-mm-dd hh24:mi:ss')
AND TO_DATE(:end_date, 'yyyy-mm-dd hh24:mi:ss')
)
),
oscpu AS
(
SELECT snap_id
, dbid
, instance_number
, stat_name
, value
FROM dba_hist_osstat
WHERE stat_name = 'NUM_CPUS'
)
SELECT s.snap_date_time -- the group column
, DECODE(u.stat_name, 'NUM_CPUS', 'Logic CPUs') stat_name -- the series column
, u.value stat_value -- the value column
FROM aas s
, oscpu u
WHERE s.snap_id = u.snap_id
AND s.dbid = u.dbid
AND s.instance_number = u.instance_number
UNION ALL
SELECT snap_date_time -- the group column
, metric_name stat_name -- the series column
, aas stat_value -- the value column
FROM aas
ORDER BY stat_name DESC
, snap_date_time
;那么,它的可視化圖表詳見下面的3個屏幕截圖(1. 綁定變量“起始時間”,2. 綁定變量“結束時間”,3. 生成的可視化圖表):



自定義時間段的平均活動會話和邏輯CPU數目(按每天間隔)
這個維度的SQL查詢語句是:
-- Average Active Sessions & Logic CPUs Custom Time Period (interval by each day).
SET LINESIZE 200
SET PAGESIZE 200
COLUMN snap_date FORMAT a12
COLUMN stat_name FORMAT a25
COLUMN stat_value FORMAT 999,999.99
ALTER SESSION SET nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
WITH aas_per_hour AS
(
SELECT snap_id
, dbid
, instance_number
, TO_CHAR(end_time, 'yyyy-mm-dd') snap_date
, metric_name
, average
FROM dba_hist_sysmetric_summary
WHERE metric_name = 'Average Active Sessions'
AND (end_time BETWEEN TO_DATE(:start_date, 'yyyy-mm-dd')
AND TO_DATE(:end_date, 'yyyy-mm-dd')
)
),
aas AS
(
SELECT snap_date -- the group column
, metric_name -- the series column
, ROUND(SUM(average)/COUNT(snap_date), 2) aas -- the value column
FROM aas_per_hour
GROUP BY snap_date
, metric_name
),
oscpu AS
(
SELECT snap_id
, dbid
, instance_number
, stat_name
, value
FROM dba_hist_osstat
WHERE stat_name = 'NUM_CPUS'
)
SELECT DISTINCT s.snap_date -- the group column
, DECODE(u.stat_name, 'NUM_CPUS', 'Logic CPUs') stat_name -- the series column
, u.value stat_value -- the value column
FROM aas_per_hour s
, oscpu u
WHERE s.snap_id = u.snap_id
AND s.dbid = u.dbid
AND s.instance_number = u.instance_number
UNION ALL
SELECT snap_date -- the group column
, metric_name stat_name -- the series column
, aas stat_value -- the value column
FROM aas
ORDER BY stat_name DESC
, snap_date
;同理,和上一個維度的圖表相似,見下面3個屏幕截圖:



可視化Oracle性能圖表之“平均活動會話&邏輯CPU”篇的分享就到這里結束了。雖然它的篇幅沒有上一篇冗長,但是兩者的思路和方法論具有異曲同工之妙,只能說是在前一篇的基礎上進行了更深層次的升華。因為,首先要讓讀者明白什么是AAS,我不得不把曾讀過和學習到的一些素材進行處理和加工,其次再以文字的形式表達出來。同時,進行一下劇透,我的下一篇文章將是可視化Oracle性能圖表之“平均可運行進程”篇(可視化Oracle性能圖表之“每秒事務數&每秒登錄數”篇),敬請期待!!!
補充:
- 將這個XML文件保存到您的電腦并用鼠標右擊Oracle SQL Developer的用戶自定義報告,然后選擇“打開報告”,點選該XML文件進行導入;
- 您也可以從我的GitHub查看這篇文章中提及到的所有SQL源代碼;
更新于 2021年11月9日 下午:
- 替換之前的“無序項目列表”的所有HTML代碼(錨點設置)中的鏈接為在“當前頁面”之內跳轉而不是在“新窗口”打開;如,之前是 <a href="......#....." target="_blank">......</a>,之后是 <a href="......#....." target="_parent">......</a>;
- 替換之前的“[返回維度目錄列表]”的所有HTML代碼(錨點設置)中的鏈接為“真正返回到維度目錄列表”而不是打開“新窗口”;如,之前是 <a href="......#....." target="_blank">[返回維度目錄列表]</a>,之后是 <a href="......#....." target="_parent">[返回維度目錄列表]</a>;
更新于 2021年11月25日 上午:
- 計劃有變,更改文章結尾段落中的劇透內容為可視化Oracle性能圖表之“平均可運行進程”篇;
最后修改時間:2021-11-25 11:01:55
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




