AWR(AutomaticWorkloadRepository)是自动负载信息库的英文缩写,AWR报告是Oracle10g以后版本提供的一种性能收集和分析工具,能提供一个时间段内整个系统资源使用情况的报告,通过报告可以了解一个系统的整个运行情况,生成的报告包括多个部分。
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数据库实例,如下图所示;第三步,执行
?/rdbms/admin/awrrpt;,会出现提示,可以生成以下几种类型AWR报告,大部分情况下都是生成本实例的AWR报告
?/rdbms/admin/awrrpt;本实例AWR包括?/rdbms/admin/awrrpti;RAC中选择实例号?/rdbms/admin/awrddrpt;AWR比对报告?/RDBMS/admin/awrgrpt;RAC全局AWR报告输入生成AWR报告的格式是html的,如下图所示:
输入天数:根据实际情况输入(如1,代表当天,如果2,代表今天和昨天,以此往前推)如下图所示:
输入开始值与结束值:(输入天数后会列出,snap值)
输入AWR报告的名称:名称自定义回车后就开始自动生产AWR报告,如下图所示:
这里说明一下快照节点可以手工创建,根据实际情况执行如下命令:
execdbms_workload_repository.create_snapshot;就可以手工创建一个快照。
结束后就可以去指定目录下照AWR报告文件,文件为test_awr.lst,如下图所示:
修改扩展名为HTML,下载到Windows平台即可查看,即可用IE打开AWR报告,如下图所示:
4分析AWR报告AWR报告内容很丰富这里选其中一小部分来讲解,分析AWR报告前先了解一下Oracle的硬解析和软解析,首先说一下Oracle对SQL的处理过程。当你发出一条SQL语句交付Oracle,在执行和获取结果前Oracle对此SQL将进行几个步骤的处理过程:
1、语法检查(syntaxcheck)
检查此SQL的拼写是否语法。
2、语义检查(semanticcheck)
诸如检查SQL语句中的访问对象是否存在及该用户是否具备相应的权限。
3、对SQL语句进行解析(prase)
利用内部算法对SQL进行解析,生成解析树(parsetree)及执行计划(executionplan)。
4、执行SQL,返回结果(executeandreturn)
其中,软、硬解析就发生在第三个过程里。
Oracle利用内部的hash算法来取得该SQL的hash值,然后在librarycache里查找是否存在该hash值;
假设存在,则将此SQL与cache中的进行比较;
假设“相同”,就将利用已有的解析树与执行计划,而省略了优化器的相关工作。这也就是软解析的过程。
当然,如果上面的2个假设中任有一个不成立,那么优化器都将进行创建解析树、生成执行计划的动作。这个过程就叫硬解析。
创建解析树、生成执行计划对于SQL的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。
打开AWR报告头如下图所示:
Elapsed快照监控时间:如果为了诊断特定时段性能问题则Elapsed不宜过长15分钟~2、3个小时。如果是看全天负载那么可以长一些,最常见是60分钟后者分钟。
DBTime:不包括Oracle后台进程消耗的时间,如果DBTime远远小于Elapsed时间,说明数据库比较空闲。
DBTime=cputime+waittime(不包含空闲等待)(非后台进程),DBTime就是记录的服务器花在数据库运算(非后台进程)和等待(非空闲等待)上的时间,DBtime=cputime+allofnonidlewaiteventtime
在79分钟里(其间收集了3次快照数据),数据库耗时11分钟,RDA数据中显示系统有8个逻辑CPU(4个物理CPU),平均每个CPU耗时1.4分钟,CPU利用率只有大约2%(1.4/79),说明系统压力非常小。
但是对于批量系统,数据库的工作负载总是集中在一段时间内,如果快照周期不在这一段时间内,或者快照周期跨度太长而包含了大量的数据库空闲时间,所得出的分析结果是没有意义的,这也说明选择分析时间段很关键,要选择能够代表性能问题的时间段。
显示SGA中每个区域的大小,可用来与初始参数值比较。
sharedpool主要包括librarycache和dictionarycache。librarycache用来存储最近解析(或编译)后SQL、PL/SQL和Javaclasses等。librarycache用来存储最近引用的数据字典。发生在librarycache或dictionarycache的cachemiss代价要比发生在buffercache的代价高得多,因此sharedpool的设置要确保最近使用的数据都能被cache。
显示数据库负载概况,将之与基线数据比较才具有更多的意义,如果每秒或每事务的负载变化不大,说明应用运行比较稳定。单个的报告数据只说明应用的负载情况,绝大多数据并没有一个所谓“正确”的值,然而Logons大于每秒1~2个、Hardparses大于每秒、全部parses超过每秒表明可能有争用问题。
Redosize:每秒产生的日志大小(单位字节),可标志数据变更频率,数据库任务的繁重与否。
Logicalreads:每秒/每事务逻辑读的块数.平决每秒产生的逻辑读的block数。LogicalReads=ConsistentGets+DBBlockGets;
Blockchanges:每秒/每事务修改的块数;
Physicalreads:每秒/每事务物理读的块数;
Physicalwrites:每秒/每事务物理写的块数;
Usercalls:每秒/每事务用户call次数;
Parses:SQL解析的次数.每秒解析次数,包括fastparse,softparse和hardparse三种数量的综合。软解析每秒超过次意味着你的"应用程序"效率不高,调整session_cursor_cache。在这里,fastparse指的是直接在PGA中命中的情况(设置了session_cached_cursors=n);softparse是指在sharedpool中命中的情形;hardparse则是指都不命中的情况。
Hardparses:其中硬解析的次数,硬解析太多,说明SQL重用率不高。每秒产生的硬解析次数,每秒超过次,就可能说明你绑定使用的不好,也可能是共享池设置不合理。这时候可以启用参数cursor_sharing=similar
force,该参数默认值为exact。但该参数设置为similar时,存在bug,可能导致执行计划的不优。
Sorts:每秒/每事务的排序次数;
Logons:每秒/每事务登录的次数;
Executes:每秒/每事务SQL执行次数;
Transactions:每秒事务数.每秒产生的事务数,反映数据库任务繁重与否。
BlockschangedperRead:表示逻辑读用于修改数据块的比例.在每一次逻辑读中更改的块的百分比。
RecursiveCall:递归调用占所有操作的比率.递归调用的百分比,如果有很多PL/SQL,那么这个值就会比较高。
Rollbackpertransaction:每事务的回滚率.看回滚率是不是很高,因为回滚很耗资源,如果回滚率过高,可能说明你的数据库经历了太多的无效操作,过多的回滚可能还会带来UndoBlock的竞争该参数计算公式如下:
Round(Userrollbacks/(user鍖椾含娌荤枟鐧界櫆椋庢墜鏈摢閲屾渶濂?鍖椾含娌荤櫧鐧滈鍘诲摢瀹跺尰闄㈡渶濂?