【干货】ORACLE-AWR报告分析

时间:2017-10-19 09:01

AWR (Automatic Workload Repository) 是自动负载信息库的英文缩写,AWR报告是Oracle 10g以后版本提供的一种性能收集和分析工具,能提供一个时间段内整个系统资源使用情况的报告,通过报告可以了解一个系统的整个运行情况,生成的报告包括多个部分。

AWR每小时对v$active_session_history视图(内存中的ASH采集信息,理论为1小时)进行采样一次,并将信息保存到磁盘中,并且保留7天,7天后旧的记录才会被覆盖。这些采样信息被保存在wrh$_active_session_history视图(写入AWR库中的ASH信息,理论为1小时以上)中。而这个采样频率(1小时)和保留时间(7天)是可以根据实际情况进行调整的,这就给DBA们提供了更加有效的系统监测工具。

2、什么情况下会用到AWR?

DBA对数据库运行状态及状况的监控了解、测试过程中发现数据库出现瓶颈但无法定位到具体原因时,可以借用AWR报告进行分析定位。

数据库出现性能问题,一般都在三个地方:IO、内存、CPU,这三个地方又是息息相关的。假设这个三个地方都没有物理上的故障,当IO负载增大时,肯定需要更多的内存来存放,同时也需要CPU花费更多的时间来过滤这些数据。相反,CPU时间花费多的话,有可能是解析SQL语句,也可能是过滤太多的数据,倒不一定是和IO或内存有关系。

CPU:解析SQL语句,尝试多个执行计划,最后生成一个数据库认为是比较好的执行计划,但不一定是最优的。因为关联表太多的时候,数据库并不会穷举所有的执行计划,这会消耗太多的时间,oracle怎么知道这条数据是你要的,另一个就不是你要的呢,这是需要cpu来过滤的。

内存:SQL语句和执行计划都需要在内存保留一段时间,还有取到的数据,根据LRU算法也会尽量在内存中保留,在执行SQL语句过程中,各种表之间的连接,排序等操作也要占用内存。

IO:如果需要的数据不在内存中,则需要到磁盘中去取,就会涉及到物理IO了,还有表之间的连接数据太多,以及排序等操作内存放不下的时候,需要用到临时表空间,也会消耗物理io了。

这里说明下,ORACLE分配的内存中PGA一般只占20%,对于专用服务器模式,每次执行SQL语句、表数据的运算等操作,都在PGA中进行的,也就是说只能用ORACL分配内存的20%左右,如果多个用户都执行多表关联,而且表数据又多,再加上关联不当的话,内存就成为瓶颈了,所以优化SQL很重要的一点就是,减少逻辑读和物理读。

3、如何生成awr报告?

第一步,登录ORACLE数据库服务器,记住当前目录或者切换至AWR想要保存的目录;

第二步,SQLplus 用户名/密码@服务连接名,连接oracle数据库实例,如下图所示;

【干货】ORACLE-AWR报告分析

第三步,执行@?/rdbms/admin/awrrpt;,会出现提示,

可以生成以下几种类型AWR报告,大部分情况下都是生成本实例的AWR报告

@?/rdbms/admin/awrrpt; 本实例AWR包括

@?/rdbms/admin/awrrpti; RAC中选择实例号

@?/rdbms/admin/awrddrpt; AWR 比对报告

@?/RDBMS/admin/awrgrpt; RAC全局AWR报告

输入生成AWR报告的格式是html的,如下图所示:

【干货】ORACLE-AWR报告分析

输入天数: 根据实际情况输入(如1,代表当天,如果2,代表今天和昨天,以此往前推)如下图所示:

【干货】ORACLE-AWR报告分析

输入开始值与结束值:(输入天数后会列出,snap值)

输入AWR报告的名称:名称自定义 回车后就开始自动生产AWR报告,如下图所示:

【干货】ORACLE-AWR报告分析

这里说明一下快照节点可以手工创建,根据实际情况执行如下命令:

exec dbms_workload_repository.create_snapshot;就可以手工创建一个快照。

【干货】ORACLE-AWR报告分析

结束后就可以去指定目录下照AWR报告文件,文件为 test_awr.lst,如下图所示:

【干货】ORACLE-AWR报告分析

修改扩展名为HTML,下载到Windows平台即可查看,即可用IE打开AWR报告,如下图所示:

【干货】ORACLE-AWR报告分析

4、分析AWR报告

AWR报告内容很丰富这里选其中一小部分来讲解,分析AWR报告前先了解一下Oracle的硬解析和软解析,首先说一下Oracle对SQL的处理过程。当你发出一条SQL语句交付Oracle,在执行和获取结果前Oracle对此SQL将进行几个步骤的处理过程:

1、语法检查(syntax check)

检查此SQL的拼写是否语法。

2、语义检查(semantic check)

诸如检查SQL语句中的访问对象是否存在及该用户是否具备相应的权限。

3、对SQL语句进行解析(prase)

利用内部算法对SQL进行解析,生成解析树(parse tree)及执行计划(execution plan)。

4、执行SQL,返回结果(execute and return)

其中,软、硬解析就发生在第三个过程里。

Oracle利用内部的hash算法来取得该SQL的hash值,然后在library cache里查找是否存在该hash值;

假设存在,则将此SQL与cache中的进行比较;

假设“相同”,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。

当然,如果上面的2个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个过程就叫硬解析。

创建解析树、生成执行计划对于SQL的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。

打开AWR报告头如下图所示:

【干货】ORACLE-AWR报告分析