Om een lang verhaal kort te maken:je zult het niet kunnen doen met een enkele query, je moet een PL/SQL schrijven om nuttige gegevens te verzamelen om nuttige informatie te verkrijgen.
Oracle heeft statistieken over "geaccumuleerde tijd", dit betekent dat de engine continu het gebruik bijhoudt. U moet een starttijd en een eindtijd definiëren voor analyse.
U kunt 'DB CPU' opvragen vanuit 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-statistieken worden beïnvloed als u slechts #1 CPU of #8 CPU's heeft. U zult dus moeten bepalen hoeveel CPU's uw engine gebruikt.
U kunt 'cpu_count' van V$PARAMETER opvragen om deze waarde te verkrijgen.
select value into t_cpus
from sys.v_$parameter
where name='cpu_count' ;
Dan is het heel eenvoudig:
Maximale totale tijd is seconden * aantal CPU's, dus als je slechts #1 CPU hebt, dan zou de maximale totale tijd "60" zijn, maar als je #2 CPU's hebt, zou de maximale totale tijd "120" zijn. #3 CPU's zal "180" zijn .. etc. ...
Dus je neemt de starttijd en eindtijd van de geanalyseerde periode met behulp van sysdate:
t_start := sysdate ;
t_end := sysdate ;
En nu bereken je het volgende:
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 ;
En dat is alles, "avgcpu" is de waarde die u zoekt.