Per farla breve:non sarai in grado di farlo con una singola query, dovrai scrivere un PL/SQL per raccogliere dati utili al fine di ottenere informazioni utili.
Oracle ha statistiche sul "tempo accumulato", questo significa che il motore tiene una traccia continua dell'utilizzo. Dovrai definire un'ora di inizio e un'ora di fine per l'analisi.
Puoi interrogare 'CPU DB' da 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 */
Le statistiche della CPU saranno interessate se hai solo la CPU n. 1 o le CPU n. 8. Quindi, dovrai determinare quante CPU sta utilizzando il tuo motore.
Puoi interrogare 'cpu_count' da V$PARAMETER per ottenere questo valore.
select value into t_cpus
from sys.v_$parameter
where name='cpu_count' ;
Quindi, è abbastanza semplice:
Il tempo totale massimo sarà di secondi * numero di CPU, quindi se hai solo la CPU n. 1, il tempo totale massimo sarebbe "60", ma se hai le CPU n. 2, il tempo totale massimo sarebbe "120" .. CPU n. 3 sarà "180"..ecc...
Quindi prendi l'ora di inizio e l'ora di fine del periodo analizzato usando sysdate:
t_start := sysdate ;
t_end := sysdate ;
E ora calcoli quanto segue:
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 ;
E il gioco è fatto, "avgcpu" è il valore che stai cercando.