概述

今天主要分享最近做的一个实验,通过实验来理解awr报告的Oracle Time Model(时间模型)。


一、环境准备

1、创建测试表

create table t1(id number(30));

2、建立AWR snapshot

exec dbms_workload_repository.create_snapshot();

3、进行事务操作

begin for i in 1..1000000 loop execute immediate 'insert into t1(id) values('||i||')'; end loop; end; /

4、建立AWR snapshot

exec dbms_workload_repository.create_snapshot();

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(1)


二、获取awr报告

@?/rdbms/admin/awrrpt.sql

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(2)

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(3)

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(4)

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(5)


三、分析awr报告

1、概况

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(6)

可以看出系统存在大量的hard parse,占用了大量的cpu time

2、时间模型

时间模型示例中“sql execute elapsed time(sql 执行所用时间)”排在顶部。“Parse time elapsed(分析所用时间)”紧随其后,而“hard parse elapsed time(硬分析所用时间)”为“parse time elapsed(分析所用时间)”的子项。您马上可以看到,硬分析占用了几乎所有分析时间,而分析时间占用了数据库时间的绝大部分。

注:各个统计信息的数据库时间百分比总和大于 100%。尽管没有将“parse time elapsed(分析所用时间)”作为“sql execute elapsed time(sql 执行所用时间)”的子项,但两者重复计入了部分元素。

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(7)

3、等待事件:

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(8)

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(9)

4、看下具体sql

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(10)


四、相关sql查询

1、查看用户session占用的CPU TIME:

select ss.username, se.SID, VALUE / 100 cpu_usage_seconds from v$session ss, v$sesstat se, v$statname sn where se.STATISTIC# = sn.STATISTIC# and NAME like '%CPU used by this session%' and se.SID = ss.SID and ss.status = 'ACTIVE' and ss.username is not null order by VALUE desc;

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(11)

2、查看系统等待事件(Wait Events)

SELECT wait_class, NAME, ROUND(time_secs, 2) time_secs, ROUND(time_secs * 100 / SUM(time_secs) OVER(), 2) pct FROM (SELECT n.wait_class, e.event NAME, e.time_waited / 100 time_secs FROM v$system_event e, v$event_name n WHERE n.NAME = e.event AND n.wait_class <> 'Idle' AND time_waited > 0 UNION SELECT 'CPU', 'server CPU', SUM(VALUE / 1000000) time_secs FROM v$sys_time_model WHERE stat_name IN ('background cpu time', 'DB CPU')) ORDER BY time_secs DESC;

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(12)

3、看哪些SQL运行了大量的PARSE

select sql_text, parse_calls, executions from v$sqlarea where rownum <4 order by parse_calls desc;

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(13)

4、系统总的PARSE情况

select name, value from v$sysstat where name like 'parse count%';

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(14)

5、CPU空间及繁忙情况

select * from v$osstat;

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(15)

6、查看每个Session的CPU利用情况

select ss.sid, se.command, ss.value CPU, se.username, se.program from v$sesstat ss, v$session se where ss.statistic# in (select statistic# from v$statname where name = 'CPU used by this session') and se.sid=ss.sid and ss.sid > 6 order by CPU desc;

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(16)

7、比较一下哪个session的CPU使用时间最多,然后查看该Session的具体情况:

select s.sid, s.event, s.MACHINE, s.OSUSER, s.wait_time, w.seq#, q.sql_text from v$session_wait w, v$session s, v$process p, v$sqlarea q where s.paddr = p.addr and s.sid=&p and s.sql_address = q.address;

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(17)

8、占用CPU最高的10个Session及其SQL语句

select s.sid,w.wait_time,w.seconds_in_wait,w.state,w.wait_time_micro,w.time_remaining_micro,w.time_since_last_wait_micro,p.USERNAME, status,server,schemaname,osuser,machine,p.terminal,p.program,logon_time,w.event,w.wait_class,tracefile,sql_text,last_active_time from v$session_wait w, v$session s, v$process p, v$sqlarea q where s.paddr=p.addr and s.sid in ( select sid from ( select ss.sid from v$sesstat ss, v$session se where ss.statistic# in ( select statistic# from v$statname where name = 'CPU used by this session' ) and se.sid=ss.sid and ss.sid>6 order by ss.value desc ) where rownum<11 ) and s.sql_address=q.address;

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(18)


后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

oracle创建带日期参数的视图(Oracle实验--理解OracleTimeModel)(19)

,