Pages

lundi 10 février 2014

Statspack : suivre le DB Time au cours du temps

Ci-dessous une requête pour suivre le DB Time au cours du temps et déterminer ainsi les periodes où la base est la plus chargée ( pour version 10g ou supérieure)


select
snap_id
,to_char(start_snap_time,'DD/MM/YYYY HH24:MI:SS') as start_snap_time
to_char(end_snap_time,'DD/MM/YYYY HH24:MI:SS') as end_snap_time
,trunc((end_snap_time-start_snap_time)*24*60*60) elapsed_time
,stat_name
,value
from (
select
     snap.snap_id
     ,snap.startup_time  as startup_time
     ,case
          when snap.startup_time - lag(snap.startup_time,1) over (partition by e.stat_id,e.dbid,snap.instance_number,snap.startup_time order by snap.snap_id ) = 0
          then lag(snap.snap_time) over (order by snap.dbid, snap.instance_number, snap.snap_id)
          when (snap.startup_time > lag(snap.startup_time,1) over (partition by e.stat_id,e.dbid,snap.instance_number,snap.startup_time order by snap.snap_id )) or
          (lag(snap.startup_time,1) over (partition by e.stat_id,e.dbid,snap.instance_number,snap.startup_time order by snap.snap_id ) is null)
          then snap.startup_time
          end start_snap_time
      , snap.snap_time AS end_snap_time
     ,sn.stat_name
     ,case
          when snap.startup_time - lag(snap.startup_time,1) over (partition by e.stat_id,e.dbid,snap.instance_number,snap.startup_time order by snap.snap_id ) = 0
           then round(((e.value - lag(e.value,1) over ( partition by e.stat_id,e.dbid,snap.instance_number,snap.startup_time order by snap.snap_id)))/1000000,1)
          when snap.startup_time > lag(snap.startup_time,1) over (partition by e.stat_id,e.dbid,snap.instance_number,snap.startup_time order by snap.snap_id )
           then round(e.value/1000000,1)
          else round(e.value/1000000,1)
     end value
from stats$sys_time_model e
     , stats$time_model_statname sn
     , stats$snapshot snap
 where
  snap.snap_id = e.snap_id
  and snap.dbid = e.dbid
  and snap.instance_number = e.instance_number
  and e.stat_id                = sn.stat_id
  -- and snap.snap_time >= TO_DATE('&start_date','DD/MM/YYYY HH24:MI')
  -- and snap.snap_time <= TO_DATE('&end_date','DD/MM/YYYY HH24:MI')
  and sn.stat_name             = 'DB time'
  -- and snap.snap_id between 1 and 82
  and snap.snap_time >= sysdate - 15
  and snap.snap_time <= sysdate -2
  order by snap.snap_id
  )
On peut utiliser cette requête sous SQL Developper afin de créer un graphique. Petit rappel, sous SQL Developper, pour créer un graphique, la requête doit retourner 3 colonnes. Par rapport à la requête ci-dessus, j'ai donc commenté les colonnes ci-dessous :



J'ai également ajouté une variable :

Il ne faut pas mettre de ";" ni de "/" à la fin de la requête.

On laisse les propriétés du graphique par défaut. Lors de l'exécution de la requête, le nombre de jours est demandé :



On obtient :

Aucun commentaire:

Enregistrer un commentaire