Lång historia kort:du kommer inte att kunna göra det med en enda fråga, du måste skriva en PL/SQL för att samla in användbar data för att få användbar information.
Oracle har "ackumulerad tid" statistik, detta gör att motorn håller koll på användningen kontinuerligt. Du måste definiera en starttid och en sluttid för analys.
Du kan fråga "DB CPU" från V$SYS_TIME_MODEL
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 */
CPU-statistik kommer att påverkas om du bara har #1 CPU eller #8 CPU. Så du måste bestämma hur många processorer din motor använder.
Du kan fråga 'cpu_count' från V$PARAMETER för att få detta värde.
select value into t_cpus
from sys.v_$parameter
where name='cpu_count' ;
Sedan är det ganska enkelt:
Maximal total tid kommer att vara sekunder * antal CPU:er, så om du bara har #1 CPU så skulle den maximala totala tiden vara "60", men om du har #2 CPU:er skulle den maximala totala tiden vara "120" .. #3 CPU:er kommer att vara "180" .. etc. ...
Så du tar starttid och sluttid för den analyserade perioden med hjälp av sysdate:
t_start := sysdate ;
t_end := sysdate ;
Och nu beräknar du följande:
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 ;
Och det är allt, "avgcpu" är värdet du letar efter.