Lang historie kort:du vil ikke være i stand til at gøre det med en enkelt forespørgsel, du bliver nødt til at skrive en PL/SQL for at indsamle nyttige data for at få brugbar information.
Oracle har "akkumuleret tid" statistik, det betyder at motoren løbende holder styr på brugen. Du bliver nødt til at definere et starttidspunkt og et sluttidspunkt for analyse.
Du kan forespørge 'DB CPU' fra 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-statistikker vil blive påvirket, hvis du kun har #1 CPU eller #8 CPU'er. Så du bliver nødt til at bestemme, hvor mange CPU'er din motor bruger.
Du kan forespørge 'cpu_count' fra V$PARAMETER for at få denne værdi.
select value into t_cpus
from sys.v_$parameter
where name='cpu_count' ;
Så er det ganske enkelt:
Maksimal total tid vil være sekunder * antal CPU'er, så hvis du kun har #1 CPU, så ville den maksimale samlede tid være "60", men hvis du har #2 CPU'er, vil den maksimale samlede tid være "120" .. #3 CPU'er vil være "180" .. osv. ...
Så du tager starttidspunkt og sluttidspunkt for den analyserede periode ved hjælp af sysdate:
t_start := sysdate ;
t_end := sysdate ;
Og nu beregner du følgende:
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 ;
Og det er det, "avgcpu" er den værdi, du leder efter.