DB Time 是awr中一个重要指标,DB Time表示操作系统耗费在数据库非线程等待的时间(DB Wiat Time)和数据库计算时间(DB Cpu Time)总和。一个正常健康的数据库,等待事件DB cpu应该在最前面,否则说明系统大部分时间在等待事件上。
Cores(CPU核心数)
Elapsed(消耗的时间,未半小时或者一小时)
DB Time(DB Time(请求时间)= DB Wait Time(DB等待时间)+ DB CPU Time(DB CPU服务时间))
判断数据库是否处于繁忙状态
即DB TIME/ ELAPSED 所得结果与Core比较,
当大于CPU核心数,则代表数据库比较繁忙,Loading较高
当小于CPU核心数,则代表数据库负荷正常
在Linux中查看cpu信息保存在cat /proc/cpuinfo
逻辑cpu = 物理cpu * cpu核数 ,开启超线程逻辑cpu是之前的两倍。
physical id只有0,说明只有1个物理cpu,如果core id也只有0,说明是单线程,每个内核有两个逻辑cpu,说明开启了超线程。
操作系统上运行的进程大部分时间对于cpu来讲,都是等待cpu的执行,因为这个时间太短,所以给我们的感觉就是一直在运行,这个等待过程就是线程等待(Idle),
如果用top命令查看进程,可以发现基本都是状态为S也就是(Sleep)状态的,实际上,你也很难从top命令看到runing的进程,如果有个进程一直是running,那肯定是不正常的,会一直占着cpu。
查询近期数据库的DB_TIME和CPU使用情况
col V_DATE for a20
col DB_CPU_PCT for a10
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=1
order by v_dbtime desc;
查看DB_TIME和CPU使用高时段的等待事件和sql
select * from (
select sql_id,event,count(*)
from dba_hist_active_sess_history
where sample_time between to_date('2022-07-31 22:00','yyyy-mm-dd hh24:mi:ss') and
to_date('2022-08-01 00:06:00','yyyy-mm-dd hh24:mi:ss')
group by sql_id,event
order by 3 desc )
where rownum < 10;
select sql_text from v$sqlarea where sql_id='g5md52uhqu94b0';