AWR 是 Oracle 10g 版本 推出的新特性, 全称叫Automatic Workload Repository-自动负载信息库。它是一种Oracle10g提供的性能收集和分析工具,是进行Oracle性能调优的利器。它能提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解一个系统的整个运行情况,这就像一个人全面的体检报告。
AWR 是通过对比两次快照(snapshot)收集到的统计信息,来生成报表数据,生成的报表包括多个部分。
下面根据某朋友公司让我帮忙分析的AWR报告来逐条说明。
DB Name | DB Id | Instance | Inst num | Startup Time | Release | RAC |
---|---|---|---|---|---|---|
FXXOA | 3654559930 | fxxoa | 1 | 08-Mar-17 06:03 | 11.2.0.1.0 | NO |
这是DB的一些基本信息,DB name,instance name, instance number, DB version以及是否是RAC安装。从这里看出这是一个11gr2的single DB。
Host Name | Platform | CPUs | Cores | Sockets | Memory (GB) |
---|---|---|---|---|---|
PXX_F10_client1 | AIX-Based Systems (64-bit) | 120 | 60 | |
50.00 |
|
Snap Id | Snap Time | Sessions | Cursors/Session |
---|---|---|---|---|
Begin Snap: | 38185 | 08-Mar-17 08:00:13 | 60 | 2.0 |
End Snap: | 38186 | 08-Mar-17 09:00:21 | 113 | 6.6 |
Elapsed: | |
60.14 (mins) | |
|
DB Time: | |
197.25 (mins) | |
|
此表显示抓取时间为2017/3/8 8:00:13至9:00:21,共计60.14分钟。开始sessions(即连接数)是60个,结束时sessions增到113个。
Cursors/Session是指平均每个session open的cursors数量。这个数的作用具体请参照 http://www.cnblogs.com/sumsen/archive/2012/07/19/2599206.html
DB Time不包括Oracle后台进程消耗的时间。如果DB Time远远小于Elapsed时间,说明数据库比较空闲。
db time= cpu time + wait time(不包含空闲等待)(非后台进程)
说白了,db time就是记录的服务器花在数据库运算(非后台进程)和等待(非空闲等待)上的时间
DB time = cpu time + all of nonidle wait event time。
这个报告中显示,snap间隔60.14分钟,那么120个cpu就有60.14*120=7216.8分钟,DB Time为197.25分钟,那么
cpu有197.25/7216.8 * 100% = 2.73%的时间花费在正经工作上。说明DB的负载很低。
对于大多数系统,数据库的工作负载总是集中在一段时间内。如果快照周期不在这一段时间内,或者快照周期跨度太长而包含了大量的数据库空闲时间,所得出的分析结果是没有意义的。这也说明选择分析时间段很关键,要选择能够代表性能问题的时间段。
Cache Sizes
|
Begin | End | |
|
---|---|---|---|---|
Buffer Cache: | 3,840M | 3,584M | Std Block Size: | 8K |
Shared Pool Size: | 5,536M | 5,536M | Log Buffer: | 116,608K |
我们知道Buffer Cache也叫数据库缓冲区高速缓存,是SGA中用来缓存已从数据文件中检索到的数据块的副本。说白了就是缓存最常用的段,以便尽可能减少访问数据时物理磁盘I/O的次数。基本上Buffer Cache越大越好。
Shared Pool主要包括library cache和dictionary cache。library cache用来存储最近解析(或编译)过的SQL、PL/SQL语句及它们对应的hash值和执行计划等。library cache用来存储最近引用的数据字典。发生在library cache或dictionary cache的cache miss代价要比发生在buffer cache的代价高得多。因此shared pool的设置要确保最近使用的数据都能被cache。
Std Block Size是数据块大小。
Log Buffer是重做日志缓冲区大小。
Load Profile
|
Per Second | Per Transaction | Per Exec | Per Call |
---|---|---|---|---|
DB Time(s): | 3.3 | 4.4 | 0.00 | 0.00 |
DB CPU(s): | 1.4 | 1.9 | 0.00 | 0.00 |
Redo size: | 6,057.5 | 8,158.4 | |
|
Logical reads: | 125,528.3 | 169,064.1 | |
|
Block changes: | 5,191.4 | 6,991.9 | |
|
Physical reads: | 356.6 | 480.2 | |
|
Physical writes: | 25.5 | 34.3 | |
|
User calls: | 2,628.2 | 3,539.7 | |
|
Parses: | 1,180.0 | 1,589.2 | |
|
Hard parses: | 62.8 | 84.6 | |
|
W/A MB processed: | 0.6 | 0.8 | |
|
Logons: | 0.2 | 0.2 | |
|
Executes: | 1,185.8 | 1,597.1 | |
|
Rollbacks: | 0.0 | 0.0 | |
|
Transactions: | 0.7 | |
|
|
Redo size:每秒产生的日志大小(单位字节),可标志数据变更频率, 数据库任务的繁重与否。
Logical reads:每秒/每事务逻辑读的块数.平均每秒产生的逻辑读的block数。Logical Reads= Consistent Gets + DB Block Gets
Block changes:每秒/每事务修改的块数
Physical reads:每秒/每事务物理读的块数
Physical writes:每秒/每事务物理写的块数
User calls:每秒/每事务用户call次数
Parses:SQL解析的次数.每秒解析次数,包括fast parse,soft parse和hard parse三种数量的综合。 软解析每秒超过300次意味着你的"应用程序"效率不高,调整session_cursor_cache。在这里,fast parse指的是直接在PGA中命中的情况(设置了session_cached_cursors=n);soft parse是指在shared pool中命中的情形;hard parse则是指都不命中的情况。
Hard parses:其中硬解析的次数,硬解析太多,说明SQL重用率不高。每秒产生的硬解析次数, 每秒超过100次,就可能说明你变量绑定使用的不好,也可能是共享池设置不合理。这时候可以启用参数cursor_sharing=similar|force,该参数默认值为exact。但该参数设置为similar时,存在bug,可能导致执行计划的不优。
Sorts:每秒/每事务的排序次数
Logons:每秒/每事务登录的次数
Executes:每秒/每事务SQL执行次数
Transactions:每秒事务数.每秒产生的事务数,反映数据库任务繁重与否。
Blocks changed per Read:表示逻辑读用于修改数据块的比例.在每一次逻辑读中更改的块的百分比。
Recursive Call:递归调用占所有操作的比率.递归调用的百分比,如果有很多PL/SQL,那么这个值就会比较高。
Rollback per transaction:每事务的回滚率.看回滚率是不是很高,因为回滚很耗资源 ,如果回滚率过高,可能说明你的数据库经历了太多的无效操作 ,过多的回滚可能还会带来Undo Block的竞争 该参数计算公式如下: Round(User rollbacks / (user commits + user rollbacks) ,4)* 100% 。
Rows per Sort:每次排序的行数
注:
Oracle的硬解析和软解析
提到软解析(soft prase)和硬解析(hard prase),就不能不说一下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的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。
Instance Efficiency Percentages (Target 100%)
Buffer Nowait %: | 100.00 | Redo NoWait %: | 99.99 |
Buffer Hit %: | 99.77 | In-memory Sort %: | 100.00 |
Library Hit %: | 93.27 | Soft Parse %: | 94.68 |
Execute to Parse %: | 0.49 | Latch Hit %: | 99.58 |
Parse CPU to Parse Elapsd %: | 26.82 | % Non-Parse CPU: | 87.07 |
Shared Pool Statistics
|
Begin | End |
---|---|---|
Memory Usage %: | 10.48 | 87.46 |
% SQL with executions>1: | 53.16 | 68.92 |
% Memory for SQL w/exec>1: | 45.97 | 87.21 |
小结:通过ORACLE的实例有效性统计数据,我们可以获得大概的一个整体印象,然而我们并不能由此来确定数据运行的性能。当前性能问题的确定,我们主要还是依靠下面的等待事件来确认。我们可以这样理解两部分的内容,hit统计帮助我们发现和预测一些系统将要产生的性能问题,由此我们可以做到未雨绸缪。而wait事件,就是表明当前数据库已经出现了性能问题需要解决,所以是亡羊补牢的性质。
Top 5 Timed Foreground Events
Event | Waits | Time(s) | Avg wait (ms) | % DB time | Wait Class |
---|---|---|---|---|---|
DB CPU | |
5,035 | |
42.55 | |
db file sequential read | 682,689 | 444 | 1 | 3.75 | User I/O |
db file scattered read | 40,279 | 160 | 4 | 1.35 | User I/O |
library cache: mutex X | 334 | 78 | 234 | 0.66 | Concurrency |
latch: shared pool | 3,896 | 71 | 18 | 0.60 | Concurrency |
Host CPU (CPUs: 120 Cores: 60 Sockets: )
Load Average Begin | Load Average End | %User | %System | %WIO | %Idle |
---|---|---|---|---|---|
2.25 | 6.08 | 1.8 | 1.9 | 0.1 | 96.3 |
Instance CPU
%Total CPU | %Busy CPU | %DB time waiting for CPU (Resource Manager) |
---|---|---|
1.2 | 31.0 | 0.0 |
Memory Statistics
|
Begin | End |
---|---|---|
Host Mem (MB): | 51,200.0 | 51,200.0 |
SGA use (MB): | 9,792.0 | 9,536.0 |
PGA use (MB): | 188.1 | 329.4 |
% Host Mem used for SGA+PGA: | 19.49 | 19.27 |
未完待续