以下脚本返回活动会话的cpu使用情况。结果显示cpu使用情况,以秒为单位。
我需要的是与cpu使用百分比相同的报告。这样做的最佳方式是什么?
--
-- Show CPU Usage for Active Sessions
--
SET PAUSE ON
SET PAUSE 'Press Return to Continue'
SET PAGESIZE 60
SET LINESIZE 300
COLUMN username FORMAT A30
COLUMN sid FORMAT 999,999,999
COLUMN serial# FORMAT 999,999,999
COLUMN "cpu usage (seconds)" FORMAT 999,999,999.0000
SELECT
s.username,
t.sid,
s.serial#,
SUM(VALUE/100) as "cpu usage (seconds)"
FROM
v$session s,
v$sesstat t,
v$statname n
WHERE
t.STATISTIC# = n.STATISTIC#
AND
NAME like '%CPU used by this session%'
AND
t.SID = s.SID
AND
s.status='ACTIVE'
AND
s.username is not null
GROUP BY username,t.sid,s.serial#
/
答案 0 :(得分:3)
长话短说:单一查询无法完成,您需要编写PL / SQL来收集有用的数据,以获取有用的信息。
Oracle有“累积时间”统计信息,这意味着引擎会持续使用。您必须定义分析的开始时间和结束时间。
您可以从V $ SYS_TIME_MODEL
查询“DB CPU”select value into t_db_cpu_i
from sys.V_$SYS_TIME_MODEL
where stat_name = 'DB CPU' ; /* start time */
...
select value into t_db_cpu_f
from sys.V_$SYS_TIME_MODEL
where stat_name = 'DB CPU' ; /* end time */
如果您只有#1 CPU或#8 CPU,则会影响CPU统计信息。因此,您必须确定引擎使用的CPU数量。
您可以从V $ PARAMETER查询'cpu_count'以获取此值。
select value into t_cpus
from sys.v_$parameter
where name='cpu_count' ;
然后,这很简单:
最大总时间将是秒数* CPU数量,因此如果您只有#1 CPU,则最大总时间将为“60”,但如果您有#2 CPU,则最大总时间将为“120”。 #3 CPU将为“180”......等......
因此,您需要使用sysdate:
获取分析时段的开始时间和结束时间t_start := sysdate ;
t_end := sysdate ;
现在你计算以下内容:
seconds_elapsed := (t_end - t_start)*24*60*60 ;
total_time := seconds_elapsed * t_cpus ;
used_cpu := t_db_cpu_f - t_db_cpu_i ;
secs_cpu := seconds_elapsed/1000000 ;
avgcpu := (secs_cpu/total_time)*100 ;
就是这样,“avgcpu”是你正在寻找的价值。