不通过收集AWR报告,采用SQL方式对数据库进行一个基本的性能评估

通过SQL可以获取DBTIME DBCPU LOADPROFILE等信息

各时间数据库繁忙程度

set linesize 160
Select 
To_Char(Dhs.Startup_Time,'mm-dd hh24:mi') As Startup_Time,Dhstm.Snap_Id, To_Char(Dhs.Begin_Interval_Time,'mm-dd hh24:mi') As Begin_Interval_Time,
Ceil( (To_Date(To_Char(End_Interval_Time,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss')-To_Date(To_Char(Begin_Interval_Time,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'))*24*60 ) As Snapshot_Delta_Minutes,
Round( (Dhstm.Value - Lag( Dhstm.Value ) Over( Partition By Dhs.Startup_Time, Dhstm.Dbid, Dhstm.Instance_Number,Dhstm.Stat_Id Order By Dhstm.Snap_Id ))/1000000/60,2) As Db_Time_Minutes, 
Round( Round( (Dhstm.Value - Lag( Dhstm.Value ) Over( Partition By Dhs.Startup_Time, Dhstm.Dbid, Dhstm.Instance_Number,Dhstm.Stat_Id Order By Dhstm.Snap_Id ))/1000000/60,2)/
Ceil( (To_Date(To_Char(End_Interval_Time,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss')-To_Date(To_Char(Begin_Interval_Time,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'))*24*60 ),2 ) As Db_Busy_Rate
From Sys.Dba_Hist_Sys_Time_Model Dhstm
Join Sys.Dba_Hist_Snapshot Dhs On Dhstm.Dbid=Dhs.Dbid And Dhstm.Instance_Number=Dhs.Instance_Number And Dhstm.Snap_Id=Dhs.Snap_Id
Where Stat_Name Like 'DB time'
Order By Snap_Id , Stat_Name;

通过SQL获取AWR中的DBTIME和DBTIME Load profile_AWR

获取DBTIME和DBCPU

select
 s.dbid,
 s.snap_id,
 min(s.end_interval_time) begin_interval_time,
 sum(decode(b.stat_name,'DB time',(e.value - b.value)/1000000/60,0))    dbtime_by_Min,
 sum(decode(b.stat_name,'DB CPU', (e.value - b.value)/1000000/60,0))    cpu__by_Min
 from DBA_HIST_SYS_TIME_MODEL e,
      DBA_HIST_SYS_TIME_MODEL b,
      DBA_HIST_SNAPSHOT       s
where b.dbid                   = s.dbid
  and b.INSTANCE_NUMBER        = s.INSTANCE_NUMBER
  and b.snap_id                = s.snap_id
  and e.dbid                   = e.dbid
  and e.INSTANCE_NUMBER        = s.INSTANCE_NUMBER and s.INSTANCE_NUMBER=1
  and e.snap_id                = s.snap_id + 1
  and b.stat_name              in ( 'DB time', 'DB CPU')
  and e.stat_name              = b.stat_name and to_char(s.begin_interval_time, 'YYYY-MM-DD') = '2023-06-16'
group by s.dbid, s.snap_id
order by 1,2;

通过SQL获取AWR中的DBTIME和DBTIME Load profile_DBTIME_02

获取数据库load profile

select instance_number,
       btime,
       SUM(DECODE(metric_name, 'User Transaction Per Sec', average, 0)) "Trx_P_S(times)",
       SUM(DECODE(metric_name, 'Logons Per Sec', average, 0)) "Logon_P_S(times)",
       SUM(DECODE(metric_name,
                  'Physical Read IO Requests Per Sec',
                  average,
                  0)) "Phy_R_IO_P_S(times)",
       SUM(DECODE(metric_name,
                  'Physical Write IO Requests Per Sec',
                  average,
                  0)) "Phy_W_IO_P_S",
       round(SUM(DECODE(metric_name, 'Redo Generated Per Sec', average, 0)) / 1024 / 1024,
             2) "Redo_P_S(M)",
       SUM(DECODE(metric_name, 'DB Block Changes Per Sec', average, 0)) "DB_Block_Changes_P_S",
       round(SUM(DECODE(metric_name,
                        'Physical Read Bytes Per Sec',
                        average,
                        0)) / 1024 / 1024,
             2) "Phy_R_P_S(M)",
       round(SUM(DECODE(metric_name,
                        'Physical Write Bytes Per Sec',
                        average,
                        0)) / 1024 / 1024,
             2) "Phy_W_P_S(M)"
  from (select t.instance_number,
               to_Char(t.BEGIN_TIME, 'yyyy-mm-dd hh24:mi') btime,
               t.metric_name,
               round(avg(t.average), 2) average
          from DBA_HIST_SYSMETRIC_SUMMARY t
         where t.metric_name in
               ('Physical Read IO Requests Per Sec',
                'Physical Write IO Requests Per Sec',
                'Redo Generated Per Sec',
                'Physical Read Bytes Per Sec',
                'Physical Write Bytes Per Sec',
                'DB Block Changes Per Sec',
                'Logons Per Sec',
                'User Transaction Per Sec')
           and to_char(t.BEGIN_TIME, 'yyyy-mm-dd') = '2023-06-16'
         group by instance_number, metric_name, t.BEGIN_TIME
         order by instance_number)
 group by instance_number, btime;

通过SQL获取AWR中的DBTIME和DBTIME Load profile_DBTIME_03

TOP EVENT

select to_char(y.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD hh24:mi') datetime,
       x.instance_number,
       x.event,
       rn,
       x.waits Waits,
       x.wait_times Total_Wait_Time_sec,
       case
         when x.event = 'DB CPU' then
          null
         else
          round(x.wait_times * 1000 / x.waits, 2)
       end avg_ms_per_time,
       x.PCT,
       wait_class
  from (SELECT snap_id,
               instance_number,
               event,
               waits,
               round(wait_times, 1) wait_times,
               round(RATIO_TO_REPORT(wait_times)
                     OVER(PARTITION BY instance_number, snap_id) * 100,
                     1) PCT,
               wait_class,
               rn
          FROM (SELECT snap_id,
                       instance_number,
                       event,
                       round(Waits) Waits,
                       wait_times,
                       rank() over(partition by snap_id, instance_number order by wait_times desc) rn,
                       wait_class
                  FROM (SELECT stat_name EVENT,
                               snap_id,
                               instance_number,
                               case
                                 when value / 1000000 - LAG(value)
                                  OVER(PARTITION BY instance_number,
                                           stat_name ORDER BY instance_number,
                                           snap_id) / 1000000 < 0 then
                                  value / 100000
                                 else
                                  value / 1000000 - LAG(value)
                                  OVER(PARTITION BY instance_number,
                                       stat_name ORDER BY instance_number,
                                       snap_id) / 1000000
                               end Waits,
                               case
                                 when value / 1000000 - LAG(value)
                                  OVER(PARTITION BY instance_number,
                                           stat_name ORDER BY instance_number,
                                           snap_id) / 1000000 < 0 then
                                  value / 100000
                                 else
                                  value / 1000000 - LAG(value)
                                  OVER(PARTITION BY instance_number,
                                       stat_name ORDER BY instance_number,
                                       snap_id) / 1000000
                               end wait_times,
                               null wait_class
                          FROM DBA_HIST_SYS_TIME_MODEL
                         WHERE stat_name = 'DB CPU'
                        UNION ALL
                        SELECT event_name,
                               snap_id,
                               instance_number,
                               case
                                 when total_waits - LAG(total_waits)
                                  OVER(PARTITION BY instance_number,
                                           event_name ORDER BY instance_number,
                                           snap_id) < 0 then
                                  total_waits
                                 else
                                  (total_waits - LAG(total_waits)
                                   OVER(PARTITION BY instance_number,
                                        event_name ORDER BY instance_number,
                                        snap_id))
                               end Waits,
                               case
                                 when (time_waited_micro / 1e6 -
                                      LAG(time_waited_micro)
                                       OVER(PARTITION BY instance_number,
                                            event_name ORDER BY instance_number,
                                            snap_id) / 1e6) < 0 then
                                  time_waited_micro / 1e6
                                 else
                                  time_waited_micro / 1e6 -
                                  LAG(time_waited_micro)
                                  OVER(PARTITION BY instance_number,
                                       event_name ORDER BY instance_number,
                                       snap_id) / 1e6
                               end wait_times,
                               wait_class
                          FROM DBA_HIST_SYSTEM_EVENT
                         WHERE wait_class not in
                               ('Idle', 'Administrative', 'System I/O'))
                 WHERE wait_times > 0
                   and waits > 0)
         WHERE rn <= 10) x,
       dba_hist_snapshot y
 where x.snap_id = y.SNAP_ID
   and x.INSTANCE_NUMBER = y.INSTANCE_NUMBER
and to_char(y.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD') = '2023-06-16'
 ORDER BY y.BEGIN_INTERVAL_TIME, y.INSTANCE_NUMBER, rn;

通过SQL获取AWR中的DBTIME和DBTIME Load profile_DBTIME_04