关于DB_TIME
近日在与Oracle原厂人员的沟通中了解到,DB_TIME可以作为监控数据库性能的重要参数
在AWR报告开头我们可以看到如下信息
先说一下三个重要的参数
- Cores(CPU核心数)
- Elapsed(消耗的时间,根据AWR报告的生成时间,一般未半小时或者一小时)
- DB Time(DB Time(请求时间)= DB Wait Time(DB等待时间)+ DB CPU Time(DB CPU服务时间))
简单透过上述三个参数即可判断数据库是否处于繁忙/异常状态
即DB TIME/ ELAPSED 所得结果与Core比较,当大于CPU核心数,则代表数据库比较繁忙,Loading较高
当小于CPU核心数,则代表数据库负荷正常
与DB相关的参数存于dba_hist_sys_time_model表中
select * from dba_hist_sys_time_model;
查询结果如下
其中snap_ID为时间点对应的ID,需要从dba_hist_snapshot该表中获取
根据上述信息,可以查询过去一段时间数据库的DB_TIME & CPU使用情况
对应的SQL如下
select to_char(end_interval_time,'yyyy-mm-dd hh24:mi') v_date,a.instance_number inst_id,round((b.value-a.value)/1000000/60/4,2) v_dbtime,
round((b.value-a.value)/1000000/60/4/(64*15/100),2)||'%' db_cpu_pct
from dba_hist_sys_time_model a,dba_hist_sys_time_model b ,dba_hist_snapshot c
where a.stat_name='DB time' and b.stat_name='DB time'
and a.dbid=b.dbid and a.dbid=(select dbid from v$database)
and a.instance_number= b.instance_number and c.instance_number=b.instance_number
and a.snap_id=c.snap_id
and b.snap_id=c.snap_id+1
and C.END_INTERVAL_TIME>=sysdate-7
and a.instance_number=&inst_id
--上述的inst_id需要从数据中单独确认
order by v_dbtime desc;
在运行该段sql是会弹出如下信息,需要输入:INST_ID(从sql中可以看出INST_ID即对应dba_hist_sys_time_model 表中的instance_number)
获取对应的Instance_number
select distinct instance_number from dba_hist_sys_time_model;
SQL结果如下
存在两个INSTANCE_NUMBER的原因为我测试用的DB为RAC环境,实际会对应两个Instance
查询到对应的结果后,在之前的SQL中数据捞取的数据:1或者2
则可以获取对应的Instance的DB_TIME & CPU使用情况
针对非RAC环境,可以将instance_number对应的语句mark掉
即(在相应环境中测试也是能够正常运行的)
select to_char(end_interval_time,'yyyy-mm-dd hh24:mi') v_date,a.instance_number inst_id,round((b.value-a.value)/1000000/60/4,2) v_dbtime,
round((b.value-a.value)/1000000/60/4/(64*15/100),2)||'%' db_cpu_pct
from dba_hist_sys_time_model a,dba_hist_sys_time_model b ,dba_hist_snapshot c
where a.stat_name='DB time' and b.stat_name='DB time'
and a.dbid=b.dbid and a.dbid=(select dbid from v$database)
and a.instance_number= b.instance_number and c.instance_number=b.instance_number
and a.snap_id=c.snap_id
and b.snap_id=c.snap_id+1
and C.END_INTERVAL_TIME>=sysdate-7
--and a.instance_number=&inst_id
order by v_dbtime desc;