长话短说:您无法通过单个查询来完成此操作,您需要编写 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”就是您正在寻找的值。