ITPub博客

首页 > 数据库 > Oracle > 转载并整理AWR报告指标解析

转载并整理AWR报告指标解析

Oracle 作者:woods_su 时间:2016-04-24 12:04:41 0 删除 编辑

AWR

一、 AWR概述

1.1 啥是AWR?

AWR (Automatic Workload Repository)

一堆历史性能数据,放在SYSAUX表空间上, AWRSYSAUX都是10g出现的,是Oracle调优的关键特性; 大约1999年左右开始开发,已经有15年历史

默认快照间隔1小时,10g保存7天、11g保存8; 可以通过DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS修改

DBA_HIST_WR_CONTROL

AWR程序核心是dbms_workload_repository

@?/rdbms/admin/awrrpt    本实例

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

1.2 谁维护AWR? 

主要是MMON(Manageability Monitor Process)和它的小工进程(m00x)

MMON的功能包括:
1.
启动slave进程m00x去做AWR快照
2.
当某个度量阀值被超过时发出alert告警
3.
为最近改变过的SQL对象捕获指标信息

1.3 AWR小技巧

手动执行一个快照:

Exec dbms_workload_repository.create_snapshot;

创建一个AWR基线

Exec DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_idend_snap_id ,baseline_name);

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

@?/rdbms/admin/awrgrpt       RAC 全局AWR

自动生成AWR HTML报告:

 

 

 

二、 报告总结

2.1 基本信息

DB Name

DB Id

Instance

Inst num

Startup Time

Release

RAC

******

3923498265

kobra1

1

10-Jan-15 10:01

11.2.0.2.0

YES

 

Host Name

Platform

CPUs

Cores

Sockets

Memory (GB)

******

Linux x86 64-bit

24

12

2

31.29

 


Snap Id

Snap Time

Sessions

Cursors/Session

Begin Snap:

26444

03-Jun-15 09:00:17

259

3.4

End Snap:

26445

03-Jun-15 10:00:22

260

4.0

Elapsed:

 

60.08 (mins)

 

 

DB Time:

 

267.07 (mins)

 

 

 

 

Elapsed 为该AWR性能报告的时间跨度(自然时间的跨度,例如前一个快照快照是9点生成的,后一个快照snapshot10点生成的,则若使用@?/rdbms/admin/awrrpt 脚本中指定这2个快照的话,那么其elapsed = 1 个小时),一个AWR性能报告 至少需要2AWR snapshot性能快照才能生成 ( 注意这2个快照时间 实例不能重启过,否则指定这2个快照生成AWR性能报告 会报错)AWR性能报告中的 指标往往是 后一个快照和前一个快照的 指标的delta,这是因为 累计值并不能反映某段时间内的系统工作负载。

 

 

DB TIME= 所有前台会话花费在数据库调用上的总和时间:

注意是前台进程foreground sessions

包括CPU时间、IO Time、和其他一系列非空闲等待时间,别忘了cpu on queue time

DB TIME 不等于 响应时间,DB TIME高了未必响应慢,DB TIME低了未必响应快

DB Time描绘了数据库总体负载,但要和elapsed time逝去时间结合起来来

Average Active Session AAS= DB time/Elapsed Time
DB Time =60 min
Elapsed Time =60 min AAS=60/60=1 负载一般
DB Time= 1min , Elapsed Time= 60 min AAS= 1/60
负载很轻
DB Time= 60000 min
Elapsed Time= 60 min AAS=1000  系统hang了吧?

 

 

DB TIME= DB CPU + Non-Idle Wait +  Wait on CPU queue

 

如果仅有2个逻辑CPU,而2session60分钟都没等待事件,一直跑在CPU上,那么:

 

DB CPU= 2 * 60 mins  DB Time = 2* 60 + 0 + 0 =120

AAS = 120/60=2  正好等于OS load 2

如果有3session100%仅消耗CPU,那么总有一个要wait on queue

DB CPU = 2* 60 mins  wait on CPU queue= 60 mins

AAS= (120+ 60)/60=3 主机load 亦为3,此时vmstat waiting for run time

 

真实世界中?  DB Cpu = xx mins Non-Idle Wait= enq:TX + cursor pin S on X + latch : xxx + db file sequential read + ……….. 阿猫阿狗

 

 

2.2 内存参数大小

 Cache Sizes


Begin

End



Buffer Cache:

5,920M

6,112M

Std Block Size:

8K

Shared Pool Size:

9,760M

9,568M

Log Buffer:

21,204K

 

  

 

内存管理方式:MSMMASMM(sga_target)AMM(memory_target)

 

小内存有小内存的问题, 大内存有大内存的麻烦! ORA-04031???!!

 

Buffer cacheshared pool size begin/end值在ASMMAMM11gR2 MSMM下可是会动的哦!

 

如果说 shared pool一直收缩,则在shrink过程中一些row cache 对象被lock住可能导致前台row cache lock等解析等待,最好别让shared pool shrink

如果说shared pool一直在grow,那说明shared pool原有大小不足以满足需求(可能是大量硬解析),结合下文的解析信息和SGA breakdown来一起诊断问题。

 

2.3 Load Profile

 


Per Second

Per Transaction

Per Exec

Per Call

DB Time(s):

4.5

0.3

0.00

0.01

DB CPU(s):

2.4

0.2

0.00

0.00

Redo size:

34,859.3

2,700.2

 

 

Logical reads:

178,042.4

13,791.3

 

 

Block changes:

234.5

18.2

 

 

Physical reads:

7,052.0

546.3

 

 

Physical writes:

8.2

0.6

 

 

User calls:

545.9

42.3

 

 

Parses:

380.4

29.5

 

 

Hard parses:

6.9

0.5

 

 

W/A MB processed:

16.8

1.3

 

 

Logons:

1.8

0.1

 

 

Executes:

10,632.9

823.6

 

 

Rollbacks:

0.0

0.0

 

 

Transactions:

12.9

 

 

 

 

 

指标

指标含义

redo size

单位 bytesredo size可以用来估量update/insert/delete的频率,大的redo size往往对lgwr写日志,和arch归档造成I/O压力, Per Transaction可以用来分辨是  大量小事务, 还是少量大事务。如上例每秒redo 34KB ,每个事务2.7KB

Logical Read

单位  次数*块数, 相当于*, 如上例  178,042 * db_block_size=1391MB/s , 逻辑读耗CPU,主频和CPU核数都很重要,逻辑读高则DB CPU往往高,也往往可以看到latch: cache buffer chains等待。  大量OLTP系统(例如siebel)可以高达几十乃至上百Gbytes

Block changes

单位 次数*块数 , 描绘数据变化频率

Physical Read

单位次数*块数, 如上例 7052 * 8k = 55MB/s, 物理读消耗IO读,

体现在IOPS和吞吐量等不同纬度上;但减少物理读可能意味着消耗更多CPU

好的存储 每秒物理读能力达到几GB,例如Exadata 

 这个physical read包含了physical reads cachephysical reads direct

Physical writes

单位  次数*块数,主要是DBWRdatafile,也有direct path write dbwr长期写出慢会导致定期log file switch(checkpoint no complete) 检查点无法完成的前台等待。  这个physical write 包含了physical writes direct +physical writes from cache

User Calls

单位次数,用户调用数,more details from internal

Parses

解析次数,包括软解析+硬解析,软解析优化得不好,则夸张地说几乎等于每秒SQL执行次数。 即执行解析比1:1,而我们希望的是 解析一次 到处运行哦!

Hard Parses

万恶之源. Cursor pin s on Xlibrary cache: mutex X latch: row cache objects /shared pool…………….. 硬解析最好少于每秒20

W/A MB processed

单位MB  W/A workarea  workarea中处理的数据数量
结合 In-memory Sort% sorts (disk) PGA Aggr一起看

Logons

登陆次数, logon storm 登陆风暴,结合AUDIT审计数据一起看。短连接的附带效应是游标缓存无用

Executes

执行次数,反应执行频率

Rollback

回滚次数, 反应回滚频率, 但是这个指标不太精确,参考而已,别太当真

Transactions

每秒事务数,是数据库层的TPS,可以看做压力测试或比对性能时的一个指标,孤立看无意义

% Blocks changed per Read

每次逻辑读导致数据块变化的比率;如果’redo size’, ‘block changes’ ‘pct of blocks changed per read’三个指标都很高,则说明系统正执行大量insert/update/delete;
pct of blocks changed per read =  (block changes ) /( logical reads)

Recursive Call %

递归调用的比率;Recursive Call % = (recursive calls)/(user calls)

Rollback per transaction %

事务回滚比率。  Rollback per transaction %= (rollback)/(transactions)

Rows per Sort

平均每次排序涉及到的行数 ;  Rows per Sort= ( sorts(rows) ) / ( sorts(disk) + sorts(memory))

 

 

 

 

 

注意这些Load Profile 负载指标 在本环节提供了 2个维度 per second per transaction

per Second:   主要是把 快照内的delta值除以快照时间的秒数 , 例如 在 A快照中V$SYSSTAT视图反应 table scans (long tables) 这个指标是 100 ,在B快照中V$SYSSTAT视图反应 table scans (long tables) 这个指标是 3700, A快照和B快照 之间 间隔了一个小时 3600秒,    对于  table scans (long tables) per second  就是 (  3700- 100) /3600=1

pert Second是我们审视数据的主要维度 ,任何性能数据脱离了 时间模型则毫无意义。

statspack/AWR出现之前 的调优 洪荒时代, 有很多DBA 依赖 V$SYSSTAT等视图中的累计 统计信息来调优,以当前的调优眼光来看,那无异于刀耕火种。

 

per transaction : 基于事务的维度,与per second相比 是把除数从时间的秒数改为了该段时间内的事务数。 这个维度的很大用户是用来 识别应用特性的变化 ,若2AWR性能报告中该维度指标 出现了大幅变化,例如 redo size从本来per transaction  1k变化为  10k per transaction,则说明SQL业务逻辑肯定发生了某些变化。

 

注意AWR中的这些指标 并不仅仅用来孤立地了解 Oracle数据库负载情况, 实施调优工作。   对于 故障诊断 例如HANGCrash等, 完全可以通过对比问题时段的性能报告和常规时间来对比,通过各项指标的对比往往可以找出 病灶所在。

  

 

2.4 Instance Efficiency Percentages (Target 100%)

 

Buffer Nowait %:

99.81

Redo NoWait %:

100.00

Buffer Hit %:

98.57

In-memory Sort %:

100.00

Library Hit %:

99.78

Soft Parse %:

98.19

Execute to Parse %:

96.42

Latch Hit %:

99.81

Parse CPU to Parse Elapsd %:

69.90

% Non-Parse CPU:

98.90

 

 

上述所有指标 的目标均为100%,即越大越好,在少数bug情况下可能超过100%或者为负值。

 

80%以上  %Non-Parse CPU

90%以上  Buffer Hit%, In-memory Sort%, Soft Parse%

95%以上  Library Hit%, Redo Nowait%, Buffer Nowait%

98%以上  Latch Hit%

 

1 Buffer Nowait %  session申请一个buffer(兼容模式)不等待的次数比例。 需要访问buffer时立即可以访问的比率,  不兼容的情况 在9i中是 buffer busy waits,从10g以后 buffer busy waits 分离为 buffer busy wait read by other session2个等待事件 :

 

(备注:下面部分还没看懂

Buffer Nowait %的计算公式是 sum(v$waitstat.wait_count) / (v$sysstat statistic session logical reads),例如在AWR中:

 

 

Class

Waits

Total Wait Time (s)

Avg Time (ms)

data block

24,543

2,267

92

undo header

743

2

3

undo block

1,116

0

0

1st level bmb

35

0

0

 

session logical reads

40,769,800

22,544.84

204.71

 

Buffer Nowait %:

99.94

 

 

Buffer Nowait= (  40,769,800 – (24543+743+1116+35))/ ( 40,769,800) = 0.99935= 99.94%

 

SELECT SUM(WAIT_COUNT) FROM DBA_HIST_WAITSTAT WHERE SNAP_ID = :B3 AND DBID = :B2 AND INSTANCE_NUMBER = :B1

 

 

2buffer HIT%: 经典的经典,高速缓存命中率,反应物理读和缓存命中间的纠结,但这个指标即便99% 也不能说明物理读等待少了

不合理的db_cache_size,或者是SGA自动管理ASMM /Memory 自动管理AMM下都可能因为db_cache_size过小引起大量的db file sequential /scattered read等待事件; maclean曾经遇到过因为大量硬解析导致ASMM shared pool共享池大幅度膨胀,而db cache相应缩小shrink的例子,最终db cache收缩到只有几百兆,本来没有的物理读等待事件都大幅涌现出来 。

此外与 buffer HIT%相关的指标值得关注的还有 table scans(long tables) 大表扫描这个统计项目、此外相关的栏目还有Buffer Pool Statistics Buffer Pool Advisory等(如果不知道在哪里,直接找一个AWR 去搜索这些关键词即可)

 

 

buffer HIT%在 不同版本有多个计算公式:

9i

Buffer Hit Ratio = 1 – ((physical reads – physical reads direct – physical reads direct (lob)) / (db block gets + consistent gets – physical reads direct – physical reads direct (lob))

10g以后:

Buffer Hit Ratio=  1 – ((‘physical reads cache’) / (‘consistent gets from cache’ + ‘db block gets from cache’)

注意:但是实际AWR中 似乎还是按照9i中的算法,虽然算法的区别对最后算得的比率影响不大。

对于buffer hit % 看它的命中率有多高没有意义,主要是关注未命中的次数有多少。通过上述公式很容易反推出未命中的物理读的次数。

db block gets consistent gets 以及 session logical reads的关系如下:

db block getsdb block gets direct+ db block gets from cache

consistent gets = consistent gets from cache+ consistent gets direct

consistent gets from cache= consistent gets – examination  + else

consistent gets – examination==>指的是不需要pin buffer直接可以执行consistent get的次数,常用于索引,只需要一次latch get

 

session logical reads = db block gets +consistent gets

 

其中physical reads physical reads cachephysical reads directphysical reads direct (lob)几者的关系为:

physical reads = physical reads cache + physical reads direct

这个公式其实说明了 物理读有2种 :

物理读进入buffer cache中 ,是常见的模式 physical reads cache

物理读直接进入PGA 直接路径读, 即physical reads direct

 

physical reads

8

Total number of data blocks read from disk. This value can be greater than the value of “physical reads direct” plus “physical reads cache” as reads into process private buffers also included in this statistic.

 

physical reads cache

8

Total number of data blocks read from disk into the buffer cache. This is a subset of “physical reads” statistic.

 

physical reads direct

8

Number of reads directly from disk, bypassing the buffer cache. For example, in high bandwidth, data-intensive operations such as parallel query, reads of disk blocks bypass the buffer cache to maximize transfer rates and to prevent the premature aging of shared data blocks resident in the buffer cache.

 

 

physical reads direct = physical reads direct (lob) + physical reads direct temporary tablespace +  physical reads direct(普通)

这个公式也说明了 直接路径读 分成三个部分:

physical reads direct (lob) 直接路径读LOB对象

physical reads direct temporary tablespace  直接路径读临时表空间

physical read direct(普通)   普通的直接路径读, 一般是11g开始的自动的大表direct path read和并行引起的direct path read

 

physical writes direct= physical writes direct (lob)+ physical writes direct temporary tablespace

DBWR checkpoint buffers written = DBWR thread checkpoint buffers written+ DBWR tablespace checkpoint buffers written+ DBWR PQ tablespace checkpoint buffers written+….

 

3Redo nowait%: session在生成redo entry时不用等待的比例,redo相关的资源争用例如redo space request争用可能造成生成redo时需求等待。此项数据来源于v$sysstat中的(redo log space requests/redo entries)。 一般来说10g以后不太用关注log_buffer参数的大小,需要关注是否有十分频繁的 log switch 过小的redo logfile size 如果配合较大的SGA和频繁的commit提交都可能造成该问题。 考虑增到redo logfile 的尺寸 : 1~4G 每个,7~10组都是合适的。同时考虑优化redo logfiledatafile I/O

 

 

4In-memory Sort%:这个指标因为它不计算workarea中所有的操作类型,所以现在越来越鸡肋了。 纯粹在内存中完成的排序比例。数据来源于v$sysstat statistics sorts (disk) sorts (memory)  In-memory Sort% =  sort(memory) / ( sort(disk)+ sort(memory) )

 

5

Library Hit%:  library cache命中率,申请一个library cache object例如一个SQL cursor时,其已经在library cache中的比例。 数据来源  V$librarycachepinspinhits。 合理值:>95%       ,该比例来源于1- ( Σ(pin Requests * Pct Miss) / Sum(Pin Requests) )

 

 

 

此外保证SQL语句绑定变量和游标可以共享也是很重要的因素。

 

6

Soft Parse: 软解析比例,无需多说的经典指标,数据来源v$sysstat statisticsparse count(total)parse count(hard)。 合理值>95%

Soft Parse %AWR中另一个重要的解析指标,该指标反应了快照时间内 软解析次数 和 总解析次数 (soft+hard 软解析次数+硬解析次数)的比值,若该指标很低,那么说明了可能存在剧烈的hard parse硬解析,大量的硬解析会消耗更多的CPU时间片并产生解析争用(此时可以考虑使用cursor_sharing=FORCE); 理论上我们总是希望 Soft Parse % 接近于100%, 但并不是说100%的软解析就是最理想的解析状态,通过设置 session_cached_cursors参数和反复重用游标我们可以让解析来的更轻量级,即通俗所说的利用会话缓存游标实现的软软解析(soft soft parse)

 

7

Execute  to Parse% 指标反映了执行解析比 其公式为 1-(parse/execute) , 目标为100% 既接近于只 执行而不解析。 数据来源v$sysstat statistics parse count (total) execute count

oracle中解析往往是执行的先提工作,但是通过游标共享 可以解析一次 执行多次, 执行解析可能分成多种场景:

hard coding => 硬编码代码 硬解析一次 ,执行一次, 则理论上其执行解析比 为 1:1 ,则理论上Execute to Parse =0 极差,且soft parse比例也为0%

绑定变量但是仍软解析=》 软解析一次,执行一次 , 这种情况虽然比前一种好 但是执行解析比(这里的parse,包含了软解析和硬解析)仍是1:1, 理论上Execute to Parse =0 极差, 但是soft parse比例可能很高

使用 静态SQL、动态绑定、session_cached_cursoropen cursors等技术实现的 解析一次,执行多次, 执行解析比为N:1, 则 Execute to Parse= 1- (1/N) 执行次数越多 Execute to Parse越接近100% ,这种是我们在OLTP环境中喜闻乐见的!

通俗地说 soft parse% 反映了软解析率, 而软解析在oracle中仍是较昂贵的操作, 我们希望的是解析1次执行N次,如果每次执行均需要软解析,那么虽然soft parse%=100% 但是parse time仍可能是消耗DB TIME的大头。

Execute to Parse反映了 执行解析比,Execute to Parsesoft parse% 都很低 那么说明确实没有绑定变量 , 而如果 soft parse% 接近99% Execute to Parse 不足90% 则说明没有执行解析比低, 需要通过 静态SQL、动态绑定、session_cached_cursoropen cursors等技术减少软解析。

 

8

Latch Hit%: willing-to-wait latch闩申请不要等待的比例。 数据来源V$latch getsmisses

 

Latch Hit%:=  (1 – (Sum(misses) / Sum(gets)))

关于Latch的更多信息内容可以参考 AWR后面的专栏Latch Statistics, 注意对于一个并发设计良好的OLTP应用来说,LatchEnqueue等并发控制不应当成为系统的主要瓶颈, 同时对于这些并发争用而言 堆积硬件CPU和内存 很难有效改善性能。

SELECT SUM(GETS), SUM(MISSES) FROM DBA_HIST_LATCH WHERE SNAP_ID = :B3 AND DBID = :B2 AND INSTANCE_NUMBER = :B1

9

Parse CPU To Parse Elapsd:该指标反映了 快照内解析CPU时间和总的解析时间的比值(Parse CPU Time/ Parse Elapsed Time)若该指标水平很低,那么说明在整个解析过程中 实际在CPU上运算的时间是很短的,而主要的解析时间都耗费在各种其他非空闲的等待事件上了(latch:shared pool,row cache lock之类等)   数据来源 V$sysstat parse time cpuparse time elapsed

 

10

%Non-Parse CPU 非解析cpu比例,公式为  (DB CPU – Parse CPU)/DB CPU  若大多数CPU都用在解析上了,则可能好钢没用在刃上了。 数据来源 v$sysstat parse time cpu cpu used by this session

 

 

2.5 Shared Pool Statistics

 


Begin

End

Memory Usage %:

67.98

64.86

% SQL with executions>1:

92.91

91.64

% Memory for SQL w/exec>1:

86.35

78.14

 

 

该环节提供一个大致的SQL重用及shared pool内存使用的评估。 应用是否共享SQL? 有多少内存是给只运行一次的SQL占掉的,对比共享SQL呢?

如果该环节中% SQL with executions>1的 比例 小于%90 , 考虑用下面链接的SQL去抓 硬编码的非绑定变量SQL语句。

Memory Usage %:    (shared pool 的实时大小- shared pool free memory)/ shared pool 的实时大小, 代表shared pool的空间使用率,虽然有使用率但没有标明碎片程度

% SQL with executions>1      复用的SQL占总的SQL语句的比率,数据来源 DBA_HIST_SQL_SUMMARY SINGLE_USE_SQLTOTAL_SQL1 – SINGLE_USE_SQL / TOTAL_SQL

% Memory for SQL w/exec>1   执行2次以上的SQL所占内存占总的SQL内存的比率,数据来源DBA_HIST_SQL_SUMMARY SINGLE_USE_SQL_MEMTOTAL_SQL_MEM1 – SINGLE_USE_SQL_MEM / TOTAL_SQL_MEM

==》上面2个指标也可以用来大致了解shared pool中的内存碎片程序,因为SINGLE_USE_SQL 单次执行的SQL多的话,那么显然可能有较多的共享池内存碎片

SQL复用率低的原因一般来说就是硬绑定变量(hard Coding)未合理使用绑定变量(bind variable),对于这种现象短期无法修改代表使用绑定变量的可以ALTER SYSTEM SET CURSOR_SHARING=FORCE; 来绕过问题,对于长期来看还是要修改代码绑定变量。   Oracle 11g开始宣称今后将废弃CURSOR_SHARINGSIMILAR选项,同时SIMILAR选项本身也造成了很多问题,所以一律不推荐用CURSOR_SHARING=SIMILAR

如果memory usage%比率一直很高,则可以关注下后面sga breakdown中的shared pool free memory大小,一般推荐至少让free memroy有个300~500MB 以避免隐患。

 

 

2.6 Top 5 Timed Events

 

 


Event

Waits

Time(s)

Avg wait (ms)

% DB time

Wait Class

DB CPU

 

8,747

 

54.59

 

db file sequential read

4,348,410

5,488

1

34.25

User I/O

db file scattered read

1,164,129

829

1

5.17

User I/O

gc buffer busy acquire

646,339

297

0

1.86

Cluster

read by other session

235,473

234

1

1.46

User I/O

 

基于Wait Interface的调优是目前的主流!每个指标都重要!

丰富的等待事件以足够的细节来描绘系统运行的性能瓶颈,这是Mysql梦寐以求的东西……

 

Waits : 该等待事件发生的次数, 对于DB CPU此项不可用

Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消耗CPU时间片的总和,但不包括Wait on CPU QUEUE

Avg Wait(ms)  :  该等待事件平均等待的时间, 实际就是  Times/Waits,单位ms, 对于DB CPU此项不可用

% Total Call Time, 该等待事件占总的call time的比率

total call time  =  total CPU time + total wait time for non-idle events

% Total Call Time  =  time for each timed event / total call time

Wait Class: 等待类型:

Concurrency,System I/O,User I/O, Administrative, Other,Configuration, Scheduler, Cluster, Application,Idle,Network,Commit

 

 

 

CPU 上在干什么?

逻辑读? 解析?Latch spin? PL/SQL、函数运算?

DB CPU/CPU timeTop 1 是好事情吗?  未必!

注意DB CPU不包含 wait on cpu queue

 

 

  SELECT e.event_name event,

         e.total_waits - NVL (b.total_waits, 0) waits,

         DECODE (

            e.total_waits - NVL (b.total_waits, 0),

            0, TO_NUMBER (NULL),

            DECODE (

               e.total_timeouts - NVL (b.total_timeouts, 0),

               0, TO_NUMBER (NULL),

                 100

               * (e.total_timeouts - NVL (b.total_timeouts, 0))

               / (e.total_waits - NVL (b.total_waits, 0))))

            pctto,

         (e.time_waited_micro - NVL (b.time_waited_micro, 0)) / 1000000 time,

         DECODE (

            (e.total_waits - NVL (b.total_waits, 0)),

            0, TO_NUMBER (NULL),

            ( (e.time_waited_micro - NVL (b.time_waited_micro, 0)) / 1000)

            / (e.total_waits - NVL (b.total_waits, 0)))

            avgwt,

         DECODE (e.wait_class, 'Idle', 99, 0) idle

    FROM dba_hist_system_event b, dba_hist_system_event e

   WHERE     b.snap_id(+) = &bid

         AND e.snap_id = &eid

         --AND b.dbid(+) = :dbid

         --AND e.dbid = :dbid

         AND b.instance_number(+) = 1

         AND e.instance_number = 1

         AND b.event_id(+) = e.event_id

         AND e.total_waits > NVL (b.total_waits, 0)

         AND e.event_name NOT IN

                ('smon timer',

                 'pmon timer',

                 'dispatcher timer',

                 'dispatcher listen timer',

                 'rdbms ipc message')

ORDER BY idle,

         time DESC,

         waits DESC,

         event

 

 

 几种常见的等待事件

=========================>

 

db file scattered read,  Avg wait time应当小于20ms  如果数据库执行全表扫描或者是全索引扫描会执行 Multi block I/O ,此时等待物理I/O 结束会出现此等待事件。一般会从应用程序(SQL),I/O 方面入手调整; 注意和《Instance Activity Stats》中的index fast full scans (full) 以及 table scans (long tables)集合起来一起看。

 

db file sequential read ,该等待事件Avg wait time平均单次等待时间应当小于20ms

db file sequential read”单块读等待是一种最为常见的物理IO等待事件,这里的sequential指的是将数据块读入到相连的内存空间中(contiguous memory space),而不是指所读取的数据块是连续的。wait event可能在以下情景中发生:

 

latch free  其实是未获得latch ,而进入latch sleep,见《全面解析9i以后Oracle Latch闩锁原理》

 

 

enq:XX           队列锁等待,视乎不同的队列锁有不同的情况:

 

 

你有多了解Oracle Enqueue lock队列锁机制?

Oracle队列锁: Enqueue HW

Oracle队列锁enq:US,Undo Segment

enq: TX row lock/index contentionallocate ITL等待事件

enq: TT contention等待事件

Oracle队列锁enq:TS,Temporary Segment (also TableSpace)

enq: JI contention等待事件

enq: US contention等待事件

enq: TM contention等待事件

enq: RO fast object reuse等待事件

enq: HW contention等待事件

 

 

free buffer waits:是由于无法找到可用的buffer cache 空闲区域,需要等待DBWR 写入完成引起

 

 一般是由于

低效的sql

过小的buffer cache

DBWR 工作负荷过量

 

 

buffer busy wait/ read by other session  一般以上2个等待事件可以归为一起处理,建议客户都进行监控 。 以上等待时间可以由如下操作引起

select/select - read by other session: 由于需要从 数据文件中将数据块读入 buffer cache 中引起,有可能是 大量的 逻辑/物理读  ;或者过小的 buffer cache 引起

select/update - buffer busy waits/ read by other session  是由于更新某数据块后 需要在undo 中 重建构建 过去时间的块,有可能伴生 enq:cr-contention 是由于大量的物理读/逻辑读造成。

update/update - buffer busy waits 由于更新同一个数据块(非同一行,同一行是enq:TX-contention) 此类问题是热点块造成

insert/insert - buffer busy waits  是由于freelist 争用造成,可以将表空间更改为ASSM 管理 或者加大freelist

 

 

write complete waits :一般此类等待事件是由于 DBWR 将脏数据写入 数据文件,其他进程如果需要修改 buffer cache会引起此等待事件,一般是 I/O 性能问题或者是DBWR 工作负荷过量引起

Wait time  1 Seconds.

 

 

control file parallel write:频繁的更新控制文件会造成大量此类等待事件,如日志频繁切换,检查点经常发生,nologging 引起频繁的数据文件更改,I/O 系统性能缓慢。

 

 

log file sync:一般此类等待时间是由于 LGWR 进程将redo log buffer 写入redo log 中发生。如果此类事件频繁发生,可以判断为:

commit 次数是否过多

I/O 系统问题

重做日志是否不必要被创建

redo log buffer 是否过大

 

2.7 Time Model Statistics

  • Total time in database user-calls (DB Time): 16023.9s
  • Statistics including the word "background" measure background process time, and so do not contribute to the DB time statistic
  • Ordered by % or DB time desc, Statistic name

Statistic Name

Time (s)

% of DB Time

sql execute elapsed time

15,608.68

97.41

DB CPU

8,746.99

54.59

PL/SQL execution elapsed time

684.99

4.27

parse time elapsed

272.68

1.70

hard parse elapsed time

199.45

1.24

hard parse (sharing criteria) elapsed time

64.85

0.40

hard parse (bind mismatch) elapsed time

42.33

0.26

PL/SQL compilation elapsed time

20.64

0.13

repeated bind elapsed time

17.07

0.11

connection management call elapsed time

15.84

0.10

inbound PL/SQL rpc elapsed time

5.35

0.03

failed parse elapsed time

2.73

0.02

RMAN cpu time (backup/restore)

0.71

0.00

sequence load elapsed time

0.16

0.00

DB time

16,023.90

 

background elapsed time

324.97

 

background cpu time

57.48

 

 

 

Time Model Statistics几个特别有用的时间指标:

 

parse time elapsedhard parse elapsed time 结合起来看解析是否是主要矛盾,若是则重点是软解析还是硬解析

sequence load elapsed time sequence序列争用是否是问题焦点

PL/SQL compilation elapsed time PL/SQL对象编译的耗时

注意PL/SQL execution elapsed time  纯耗费在PL/SQL解释器上的时间。不包括花在执行和解析其包含SQL上的时间

connection management call elapsed time 建立数据库session连接和断开的耗时

failed parse elapsed time 解析失败,例如由于ORA-4031

hard parse (sharing criteria) elapsed time  由于无法共享游标造成的硬解析

hard parse (bind mismatch) elapsed time  由于bind type or bind size 不一致造成的硬解析

 

注意该时间模型中的指标存在包含关系所以Time Model Statistics加起来超过100%再正常不过

 

 

1) background elapsed time

    2) background cpu time

          3) RMAN cpu time (backup/restore)

 

 

 

2.8 Foreground Wait Class 

  • s - second, ms - millisecond - 1000th of a second
  • ordered by wait time desc, waits desc
  • %Timeouts: value of 0 indicates value was < .5%. Value of null is truly 0
  • Captured Time accounts for 101.2% of Total DB time 16,023.90 (s)
  • Total FG Wait Time: 7,470.77 (s) DB CPU time: 8,746.99 (s)

Wait Class

Waits

%Time -outs

Total Wait Time (s)

Avg wait (ms)

%DB time

DB CPU

 

 

8,747

 

54.59

User I/O

5,861,583

0

6,827

1

42.61

Cluster

959,205

0

382

0

2.38

Commit

31,096

0

131

4

0.82

Concurrency

40,152

0

45

1

0.28

Other

174,359

66

43

0

0.27

Network

1,827,372

0

21

0

0.13

System I/O

29,413

0

12

0

0.07

Application

29,558

0

9

0

0.05

Configuration

5

100

0

9

0.00

Administrative

1

0

0

27

0.00

 

 

Wait Class: 等待事件的类型,如上查询所示,被分作11个类型。  10.2.0.5916个等待事件,其中Other类型占622个。

Waits:  该类型所属等待事件在快照时间内的等待次数

%Time Out  等待超时的比率, 未 超时次数/waits  * 100 (%)

Total Wait Time: 该类型所属等待事件总的耗时,单位为秒

Avg Wait(ms) : 该类型所属等待事件的平均单次等待时间,单位为ms ,实际这个指标对commit user i/o 以及system i/o类型有点意义,其他等待类型由于等待事件差异较大所以看平均值的意义较小

waits / txn:   该类型所属等待事件的等待次数和事务比

 

Other 类型,遇到该类型等待事件 的话 常见的原因是Oracle Bug或者 网络、I/O存在问题。

Concurrency 类型   并行争用类型的等待事件,  典型的如 latch: shared poollatch: library cacherow cache locklibrary cache pin/lock

Cluster 类型  Real Application Cluster RAC环境中的等待事件, 需要注意的是 如果启用了RAC option,那么即使你的集群中只启动了一个实例,那么该实例也可能遇到 Cluster类型的等待事件, 例如gc buffer busy

System I/O  主要是后台进程维护数据库所产生的I/O,例如control file parallel write log file parallel writedb file parallel write

User I/O    主要是前台进程做了一些I/O操作,并不是说后台进程不会有这些等待事件。 典型的如db file sequential/scattered  readdirect path read

Configuration  由于配置引起的等待事件,  例如 日志切换的log file switch completion (日志文件 大小/数目 不够)sequenceenq: SQ – contention (Sequence 使用nocache) Oracle认为它们是由于配置不当引起的,但实际未必真是这样的配置引起的。

Application  应用造成的等待事件, 例如enq: TM – contentionenq: TX – row lock contention Oracle认为这是由于应用设计不当造成的等待事件, 但实际这些Application class 等待可能受到 ConcurrencyClusterSystem I/O User I/O等多种类型等待的影响,例如本来commit只要1ms ,则某一行数据仅被锁定1ms, 但由于commit变慢 从而释放行锁变慢,引发大量的enq: TX – row lock contention等待事件。

 

Commit  log file sync log file sync的影响十分广泛,值得我们深入讨论。

 

Network :  网络类型的等待事件 例如 SQL*Net more data to client  SQL*Net more data to dblink

 

 

2.9 前台等待事件

  • s - second, ms - millisecond - 1000th of a second
  • Only events with Total Wait Time (s) >= .001 are shown
  • ordered by wait time desc, waits desc (idle events last)
  • %Timeouts: value of 0 indicates value was < .5%. Value of null is truly 0

Event

Waits

%Time -outs

Total Wait Time (s)

Avg wait (ms)

Waits /txn

% DB time

db file sequential read

4,348,410

0

5,488

1

93.44

34.25

db file scattered read

1,164,129

0

829

1

25.02

5.17

gc buffer busy acquire

646,339

0

297

0

13.89

1.86

read by other session

235,473

0

234

1

5.06

1.46

direct path read

101,912

0

209

2

2.19

1.30

log file sync

31,096

0

131

4

0.67

0.82

db file parallel read

8,704

0

67

8

0.19

0.42

gc current block 2-way

160,587

0

45

0

3.45

0.28

cursor: pin S wait on X

113

0

36

316

0.00

0.22

gc cr grant 2-way

129,743

0

27

0

2.79

0.17

log switch/archive

2

100

20

10003

0.00

0.12

SQL*Net message from dblink

19,535

0

20

1

0.42

0.12

control file sequential read

29,176

0

11

0

0.63

0.07

reliable message

10,864

0

11

1

0.23

0.07

gc cr multi block request

12,781

0

10

1

0.27

0.06

 (只是一部分)

 

Foreground Wait Events 前台等待事件,数据主要来源于DBA_HIST_SYSTEM_EVENT

Event 等待事件名字

Waits  该等待事件在快照时间内等待的次数

%Timeouts :  每一个等待事件有其超时的设置,例如buffer busy waits 一般为3秒, Write Complete Waits timeout1秒,如果等待事件 单次等待达到timeout的时间,则会进入下一次该等待事件

Total Wait Time  该等待事件 总的消耗的时间 ,单位为秒

Avg wait(ms): 该等待事件的单次平均等待时间,单位为毫秒

Waits/Txn: 该等待事件的等待次数和事务比

 

 

 

2.10 后台等待事件

 

  • ordered by wait time desc, waits desc (idle events last)
  • Only events with Total Wait Time (s) >= .001 are shown
  • %Timeouts: value of 0 indicates value was < .5%. Value of null is truly 0

Event

Waits

%Time -outs

Total Wait Time (s)

Avg wait (ms)

Waits /txn

% bg time

log file parallel write

48,340

0

154

3

1.04

47.41

db file parallel write

7,834

0

29

4

0.17

8.78

control file sequential read

12,132

0

23

2

0.26

6.93

Backup: MML create a backup piece

2

0

14

7129

0.00

4.39

control file parallel write

1,704

0

6

3

0.04

1.71

db file sequential read

728

0

5

6

0.02

1.45

Backup: MML write backup piece

1,570

0

5

3

0.03

1.40

ASM file metadata operation

6,692

0

3

0

0.14

0.87

Backup: MML commit backup piece

2

0

2

1052

0.00

0.65

DFS lock handle

4,927

92

2

0

0.11

0.63

enq: KO - fast object checkpoint

4,237

0

2

0

0.09

0.50

log file sequential read

81

0

1

15

0.00

0.37

ges lms sync during dynamic remastering and reconfig

48

67

1

16

0.00

0.24

gc cr multi block request

369

0

1

1

0.01

0.15

gc current block 2-way

1,783

0

0

0

0.04

0.15

 

 

Background Wait Events 后台等待事件, 数据主要来源于DBA_HIST_BG_EVENT_SUMMARY

 

Event 等待事件名字

Waits  该等待事件在快照时间内等待的次数

%Timeouts :  每一个等待事件有其超时的设置,例如buffer busy waits 一般为3秒, Write Complete Waits timeout1秒,如果等待事件 单次等待达到timeout的时间,则会进入下一次该等待事件

Total Wait Time  该等待事件 总的消耗的时间 ,单位为秒

Avg wait(ms): 该等待事件的单次平均等待时间,单位为毫秒

Waits/Txn: 该等待事件的等待次数和事务比

 

 

2.11 Operating System Statistics

  • *TIME statistic values are diffed. All others display actual values. End Value is displayed if different
  • ordered by statistic type (CPU Use, Virtual Memory, Hardware Config), Name

Statistic

Value

End Value

BUSY_TIME

1,013,483

 

IDLE_TIME

7,637,944

 

IOWAIT_TIME

466,014

 

NICE_TIME

0

 

SYS_TIME

125,265

 

USER_TIME

875,684

 

LOAD

3

4

RSRC_MGR_CPU_WAIT_TIME

0

 

VM_IN_BYTES

-4,184,354,341,888

 

VM_OUT_BYTES

2,895,542,272

 

PHYSICAL_MEMORY_BYTES

33,602,723,840

 

NUM_CPUS

24

 

NUM_CPU_CORES

12

 

NUM_CPU_SOCKETS

2

 

GLOBAL_RECEIVE_SIZE_MAX

4,194,304

 

GLOBAL_SEND_SIZE_MAX

1,048,586

 

TCP_RECEIVE_SIZE_DEFAULT

87,380

 

TCP_RECEIVE_SIZE_MAX

4,194,304

 

TCP_RECEIVE_SIZE_MIN

4,096

 

TCP_SEND_SIZE_DEFAULT

16,384

 

TCP_SEND_SIZE_MAX

4,194,304

 

TCP_SEND_SIZE_MIN

4,096

 

 

Operating System Statistics   操作系统统计信息

 

数据来源于V$OSSTAT  / DBA_HIST_OSSTATTIME相关的指标单位均为百分之一秒

 

统计项

描述

NUM_CPU_SOCKETS

物理CPU的数目

NUM_CPU_CORES

CPU的核数

NUM_CPUS

逻辑CPU的数目

SYS_TIME

在内核态被消耗掉的CPU时间片,单位为百分之一秒

USER_TIME

在用户态被消耗掉的CPU时间片,单位为百分之一秒

BUSY_TIME

Busy_Time=SYS_TIME+USER_TIME 消耗的CPU时间片,单位为百分之一秒

AVG_BUSY_TIME

AVG_BUSY_TIME= BUSY_TIME/NUM_CPUS

IDLE_TIME

空闲的CPU时间片,单位为百分之一秒

所有CPU所能提供总的时间片

BUSY_TIME + IDLE_TIME = ELAPSED_TIME * CPU_COUNT

OS_CPU_WAIT_TIME

进程等OS调度的时间,cpu queuing

VM_IN_BYTES

换入页的字节数

VM_OUT_BYTES

换出页的字节数,部分版本下并不准确,例如Bug 11712010 Abstract: VIRTUAL MEMORY PAGING ON 11.2.0.2 DATABASES,仅供参考

IOWAIT_TIME

所有CPU花费在等待I/O完成上的时间  单位为百分之一秒

RSRC_MGR_CPU_WAIT_TIME

是指当resource manager控制CPU调度时,需要控制对应进程暂时不使用CPU而进程到内部运行队列中,以保证该进程对应的consumer group(消费组)没有消耗比指定resource manager指令更多的CPURSRC_MGR_CPU_WAIT_TIME指等在内部运行队列上的时间,在等待时不消耗CPU

 

 

2.11 Service Statistcs

 

  • ordered by DB Time

Service Name

DB Time (s)

DB CPU (s)

Physical Reads (K)

Logical Reads (K)

cms

13,923

7,180

12,861

514,295

fms

2,038

1,539

12,570

127,295

SYS$USERS

32

8

0

0

kobra

29

15

1

84

SYS$BACKGROUND

0

0

1

78

kobraXDB

0

0

0

0

 

按照Service Name来分组时间模型和 物理、逻辑读取, 部分数据来源于 WRH$_SERVICE_NAME;

Service Name  对应的服务名  (v$services) SYS$BACKGROUND代表后台进程, SYS$USERS一般是系统用户登录

DB TIME (s):  本服务名所消耗的DB TIME时间,单位为秒

DB CPU(s):  本服务名所消耗的DB CPU 时间,单位为秒

Physical Reads : 本服务名所消耗的物理读

Logical Reads : 本服务所消耗的逻辑读

 

 

 

2.12 Service Wait Class Stats

  • Wait Class info for services in the Service Statistics section.
  • Total Waits and Time Waited displayed for the following wait classes: User I/O, Concurrency, Administrative, Network
  • Time Waited (Wt Time) in seconds

Service Name

User I/O Total Wts

User I/O Wt Time

Concurcy Total Wts

Concurcy Wt Time

Admin Total Wts

Admin Wt Time

Network Total Wts

Network Wt Time

cms

5724210

6417

34768

43

0

0

1642136

1

fms

134758

407

4563

1

0

0

177366

20

SYS$USERS

205

0

29

0

1585

21

4544

0

kobra

2530

3

785

0

0

0

3476

0

SYS$BACKGROUND

952

5

32892

1

0

0

0

0

          -------------------------------------------------------------

 

 

User I/O Total Wts : 对应该服务名下 用户I/O类等待的总的次数

User I/O Wt Time : 对应该服务名下 用户I/O累等待的总时间,单位为 1/100

Concurcy Total Wts: 对应该服务名下 Concurrency 类型等待的总次数

Concurcy Wt Time :对应该服务名下 Concurrency 类型等待的总时间, 单位为 1/100

Admin Total Wts: 对应该服务名下Admin 类等待的总次数

Admin Wt Time: 对应该服务名下Admin类等待的总时间,单位为 1/100

Network Total Wts : 对应服务名下Network类等待的总次数

Network Wt Time: 对应服务名下Network类等待的总事件, 单位为 1/100

 

2.13 Host CPU 


Load Average Begin

Load Average End

%User

%System

%WIO

%Idle

3.24

4.30

10.1

1.4

5.4

88.3

 

“Load Average”  begin/end值代表每个CPU的大致运行队列大小。上例中快照开始到结束,平均 CPU负载增加了;与《2.11 Operating System Statistics》中的LOAD相呼应。

 

%User+%System=> 总的CPU使用率,在这里是11.5%

 

Elapsed Time * NUM_CPUS * CPU utilization =Busy Time

 

 

2.14 Instance CPU 


%Total CPU

%Busy CPU

%DB time waiting for CPU (Resource Manager)

10.2

86.9

0.0

 

%Total CPU,该实例所使用的CPU占总CPU的比例  % of total CPU for Instance

%Busy CPU,该实例所使用的Cpu占总的被使用CPU的比例  % of busy CPU for Instance

例如共4个逻辑CPU,其中3个被完全使用,3个中的1个完全被该实例使用,则%Total CPU= ? =25%,而%Busy CPU= 1/3= 33%

CPU高时一般看%Busy CPU可以确定CPU到底是否是本实例消耗的,还是主机上其他程序

% of busy CPU for Instance= DB CPU+ background cpu time) / (BUSY_TIME /100)

% of Total CPU for Instance = ( DB CPU+ background cpu time)/( BUSY_TIME+IDLE_TIME/100)

%DB time waiting for CPU (Resource Manager)= (RSRC_MGR_CPU_WAIT_TIME/100)/DB TIME

 

 

三、 TOP SQL

 

TOP SQL 的数据部分来源于 dba_hist_sqlstat

 

3.1 SQL ordered by Elapsed Time

按照SQL消耗的时间来排列TOP SQL

  • Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
  • % Total DB Time is the Elapsed Time of the SQL statement divided into the Total Database Time multiplied by 100
  • %Total - Elapsed Time as a percentage of Total DB time
  • %CPU - CPU Time as a percentage of Elapsed Time
  • %IO - User I/O Time as a percentage of Elapsed Time
  • Captured SQL account for 72.8% of Total DB Time (s): 16,024
  • Captured PL/SQL account for 14.2% of Total DB Time (s): 16,024

Elapsed Time (s)

Executions

Elapsed Time per Exec (s)

%Total

%CPU

%IO

SQL Id

SQL Module

SQL Text

1,694.57

168

10.09

10.58

49.14

48.11

otcd.tsk@PCMSAPP01 (TNS V1-V3)

select 'ROW::'||MESSAGE from t...

848.97

50

16.98

5.30

22.61

70.42

cfets_rerolld@PCMSAPP01 (TNS V1-V3)

Begin PROC_PROCESS_REROLL_EVEN...

739.55

216

3.42

4.62

34.79

58.01

otcd.tsk@PCMSAPP01 (TNS V1-V3)

Begin PROCESS_CSTP_AUTO_IMPORT...

(……)

 

对于鹤立鸡群的SQL很有必要一探究竟,跑个@?/rdbms/admin/awrsqrpt看看吧!

 

Elapsed Time (s): SQL累计运行所消耗的时间,

Executions :  SQL在快照时间内 总计运行的次数;注意,对于在快照时间内还没有执行完的SQL 不计为1次,所以如果看到executions=0而 又是TOP SQL,则很有可能是因为该SQL 运行较旧还没执行完,需要特别关注一下。

 

 

Elapsed Time per Exec (s):平均每次执行该SQL耗费的时间 , 对于OLTP类型的SELECT/INSERT/UPDATE/DELETE而言平均单次执行时间应当非常短,如0.1秒 或者更短才能满足其业务需求,如果这类轻微的OLTP操作单次也要几秒钟的话,是无法满足对外业务的需求的; 例如你在ATM上提款,并不仅仅是对你的账务库的简单UPDATE,而需要在类似风险控制的前置系统中记录你本次的流水操作记录,实际取一次钱可能要有几十乃至上百个OLTP类型的语句被执行,但它们应当都是十分快速的操作; 如果这些操作也变得很慢,则会出现大量事务阻塞,系统负载升高,DB TIME急剧上升的现象。  对于OLTP数据库而言 如果执行计划稳定,那么这些OLTP操作的性能应当是铁板钉钉的,但是一旦某个因素 发生变化,例如存储的明显变慢、内存换页的大量出现时 则上述的这些transaction操作很可能成数倍到几十倍的变慢,这将让此事务系统短期内不可用。

对于维护操作,例如加载或清除数据,大的跑批次、报表而言 Elapsed Time per Exec (s)高一些是正常的。

%Total  SQL所消耗的时间占总的DB Time的百分比, 即 (SQL Elapsed Time / Total DB TIME)

% CPU   SQL 所消耗的CPU 时间 占 该SQL消耗的时间里的比例, 即 (SQL CPU Time / SQL Elapsed Time) ,该指标说明了该语句是否是CPU敏感的

%IO SQL 所消耗的I/O 时间 占 该SQL消耗的时间里的比例, 即(SQL I/O Time/SQL Elapsed Time) ,该指标说明了该语句是否是I/O敏感的

SQL Id : 通过计算SQL 文本获得的SQL_ID ,不同的SQL文本必然有不同的SQL_ID, 对于10g~11g而言 只要SQL文本不变那么在数据库之间 该SQL 对应的SQL_ID应当不不变的, 12c中修改了SQL_ID的计算方法

 

Captured SQL account for 72.8% of Total DB Time (s): 16,024 对于不绑定变量的应用来说Top SQL有可能失准,所以要参考本项

 

3.2 SQL ordered by CPU Time

  •  
    Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
  • %Total - CPU Time as a percentage of Total DB CPU
  • %CPU - CPU Time as a percentage of Elapsed Time
  • %IO - User I/O Time as a percentage of Elapsed Time
  • Captured SQL account for 91.2% of Total CPU Time (s): 8,747
  • Captured PL/SQL account for 11.4% of Total CPU Time (s): 8,747

CPU Time (s)

Executions

CPU per Exec (s)

%Total

Elapsed Time (s)

%CPU

%IO

SQL Id

SQL Module

SQL Text

832.75

168

4.96

9.52

1,694.57

49.14

48.11

otcd.tsk@PCMSAPP01 (TNS V1-V3)

select 'ROW::'||MESSAGE from t...

589.32

49

12.03

6.74

638.53

92.29

7.58

otcd.tsk@PCMSAPP01 (TNS V1-V3)

select message from table(RISK...

560.94

4,824

0.12

6.41

561.48

99.90

0.04

cfets_rerolld@PCMSAPP01 (TNS V1-V3)

Select Substr(Get_Currency_Tra...

(……)

 

  

CPU TIME :   SQL 在快照时间内累计执行所消耗的CPU 时间片,单位为s

Executions :  SQL在快照时间内累计执行的次数

CPU per Exec (s) :该SQL 平均单次执行所消耗的CPU时间 ,    ( SQL CPU TIME / SQL Executions )

%Total : SQL 累计消耗的CPU时间 占  该时段总的 DB CPU的比例,  ( SQL CPU TIME /  Total DB CPU)

% CPU   SQL 所消耗的CPU 时间 占 该SQL消耗的时间里的比例, 即 (SQL CPU Time / SQL Elapsed Time) ,该指标说明了该语句是否是CPU敏感的

%IO SQL 所消耗的I/O 时间 占 该SQL消耗的时间里的比例, 即(SQL I/O Time/SQL Elapsed Time) ,该指标说明了该语句是否是I/O敏感的

 

 

 

3.3 SQL ordered by Gets

  • Resources reported for PL/SQL code includes the resources used by all SQL statements called by the code.
  • %Total - Buffer Gets as a percentage of Total Buffer Gets
  • %CPU - CPU Time as a percentage of Elapsed Time
  • %IO - User I/O Time as a percentage of Elapsed Time
  • Total Buffer Gets: 641,792,913
  • Captured SQL account for 86.5% of Total

Buffer Gets

Executions

Gets per Exec

%Total

Elapsed Time (s)

%CPU

%IO

SQL Id

SQL Module

SQL Text

61,080,438

20,360,700

3.00

9.52

337.22

101.1

0

SQL*Plus

SELECT TRIM(TABLE_TEXT) FROM G...

51,608,064

49

1,053,225.80

8.04

638.53

92.3

7.6

otcd.tsk@PCMSAPP01 (TNS V1-V3)

select message from table(RISK...

47,802,065

168

284,536.10

7.45

1,694.57

49.1

48.1

otcd.tsk@PCMSAPP01 (TNS V1-V3)

select 'ROW::'||MESSAGE from t...

 

注意 buffer gets 逻辑读是消耗CPU TIME的重要源泉, 但并不是说消耗CPU TIME的只有buffer gets。 大多数情况下 SQL order by CPU TIME SQL order by buffers gets 2个部分的TOP SQL 及其排列顺序都是一样的,此种情况说明消耗最多buffer gets的 就是消耗最多CPU SQL 如果我们希望降低系统的CPU使用率,那么只需要调优SQL 降低buffer gets 即可。

但也并不是100%的情况都是如此 CPU TIME的消耗者 还包括 函数运算、PL/SQL 控制、Latch /Mutex Spin等等, 所以SQL order by CPU TIME SQL order by buffers gets 2个部分的TOP SQL 完全不一样也是有可能的, 需要因地制宜来探究到底是什么问题导致的High CPU,进而裁度解决之道。

 

Buffer Gets : SQL在快照时间内累计运行所消耗的buffer gets,包括了consistent read current read

Executions :  SQL在快照时间内累计执行的次数

Gets  per Exec : SQL平均单次的buffer gets , 对于事务型transaction操作而言 一般该单次buffer gets小于2000

% Total  SQL 累计运行所消耗的buffer gets占 总的db buffer gets的比率 (SQL buffer gets / DB total buffer gets)

 

 

 

3.4 SQL ordered by Reads


  • %Total - Physical Reads as a percentage of Total Disk Reads
  • %CPU - CPU Time as a percentage of Elapsed Time
  • %IO - User I/O Time as a percentage of Elapsed Time
  • Total Disk Reads: 25,420,418
  • Captured SQL account for 41.9% of Total

Physical Reads

Executions

Reads per Exec

%Total

Elapsed Time (s)

%CPU

%IO

SQL Id

SQL Module

SQL Text

3,047,615

168

18,140.57

11.99

1,694.57

49.14

48.11

otcd.tsk@PCMSAPP01 (TNS V1-V3)

select 'ROW::'||MESSAGE from t...

2,935,165

117

25,086.88

11.55

730.42

32.23

62.11

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT COUNT(*) FROM CFETS_TRA...

2,614,747

216

12,105.31

10.29

739.55

34.79

58.01

otcd.tsk@PCMSAPP01 (TNS V1-V3)

Begin PROCESS_CSTP_AUTO_IMPORT...

 

Physical reads : SQL累计运行所消耗的物理读

Executions :  SQL在快照时间内累计执行的次数

Reads per Exec : SQL 单次运行所消耗的物理读,  (SQL Physical reads/Executions) , 对于OLTP transaction 类型的操作而言单次一般不超过100

%Total : SQL 累计消耗的物理读 占  该时段总的 物理读的比例,  ( SQL physical read  /  Total DB physical read )

 

 

3.5 SQL ordered by Executions

 

  • %CPU - CPU Time as a percentage of Elapsed Time
  • %IO - User I/O Time as a percentage of Elapsed Time
  • Total Executions: 38,328,683
  • Captured SQL account for 62.4% of Total

Executions

Rows Processed

Rows per Exec

Elapsed Time (s)

%CPU

%IO

SQL Id

SQL Module

SQL Text

20,360,700

20,360,218

1.00

337.22

101.1

0

SQL*Plus

SELECT TRIM(TABLE_TEXT) FROM G...

2,675,510

2,675,438

1.00

251.77

101.2

.1

batch_process@PCMSAPP01 (TNS V1-V3)

SELECT COUNT(*) FROM TABLE(SPL...

328,032

328,032

1.00

262.55

100.1

0

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT SUBSTR(A.DAYS, 1, GET_M...

 

按照 执行次数来排序的话,也是性能报告对比时一个重要的参考因素,因为如果TOP SQL的执行次数有明显的增长,那么 性能问题的出现也是意料之中的事情了。 当然执行次数最多的,未必便是对性能影响最大的TOP SQL

 

Executions :  SQL在快照时间内累计执行的次数

Rows Processed: 该SQL在快照时间内累计执行所处理的总行数

Rows per Exec: SQL平均单次执行所处理的行数,  这个指标在诊断一些 数据问题造成的SQL性能问题时很有用

 

 

3.6 SQL ordered by Parse Calls

 

  • Total Parse Calls: 1,371,092
  • Captured SQL account for 18.1% of Total

Parse Calls

Executions

% Total Parses

SQL Id

SQL Module

SQL Text

33,497

80,848

2.44

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT U.CUS_NUMBER FROM WUSER...

27,022

62,205

1.97

batch_process@PCMSAPP01 (TNS V1-V3)

SELECT TRIM(GET_PREV_TRADE_DAT...

18,336

48,232

1.34

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT COUNT(1) FROM SECURITY_...

Parse Calls : 解析调用次数, 与上文的 Load Profile中的Parse 数一样 包括 软解析soft parse和硬解析hard parse

Executions :  SQL在快照时间内累计执行的次数

%Total Parses : SQL 解析调用次数 占 该时段数据库总解析次数的比率, 为 (SQL Parse Calls / Total DB Parse Calls)

 

 

3.7 SQL ordered by Sharable Memory

 

  • Only Statements with Sharable Memory greater than 1048576 are displayed

Sharable Mem (b)

Executions

% Total

SQL Id

SQL Module

SQL Text

15,241,662

1

0.15

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT 'A0 <security_tra... <="" security_tra...

3,603,631

11

0.04

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT /*+OPT_PARAM('_simple_v...

2,804,959

11

0.03

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT /*+OPT_PARAM('_simple_v...

Module: MZContentBridge

SELECT t0.ASPECT_RATIO, t0.CREATED, t0.FILE_EXTENSION, t0.HEIGHT, t0.VIDEO_FILE_

DIMENSIONS_ID, t0.LAST_MODIFIED, t0.NAME, t0.WIDTH FROM MZ_VIDEO_FILE_DIMENSIONS

 t0 WHERE (t0.HEIGHT = :1 AND t0.WIDTH = :2 )

 

 

SQL ordered by Sharable Memory ,    一般该部分仅列出Sharable Mem (b)1 MB以上的SQL 对象 (Only Statements with Sharable Memory greater than 1048576 are displayed)   数据来源是 DBA_HIST_SQLSTAT.SHARABLE_MEM

Shareable Mem(b):  SQL 对象所占用的共享内存使用量

Executions :  SQL在快照时间内累计执行的次数

%Total :  SQL 对象锁占共享内存 占总的共享内存的比率

 

 

3.8 SQL ordered by Version Count

  • Only Statements with Version Count greater than 20 are displayed

Version Count

Executions

SQL Id

SQL Module

SQL Text

403

107

SQL*Plus

SELECT COUNT(1) FROM SECURITY ...

108

11

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT /*+OPT_PARAM('_simple_v...

108

11

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT /*+OPT_PARAM('_simple_v...

 

Version Count  Oracle中的执行计划可以是多版本的,即对于同一个SQL语句有多个不同版本的执行计划,这些执行计划又称作子游标, 而一个SQL语句的文本可以称作一个父游标。 一个父游标对应多个子游标,产生不同子游标的原因是 SQL在被执行时无法共享之前已经生成的子游标, 原因是多种多样的,例如 在本session中做了一个优化器参数的修改 例如optimizer_index_cost_adj 100 修改到99,则本session的优化环境optimizer env将不同于之前的子游标生成环境,这样就需要生成一个新的子游标,例如:

 

 

SQL> create table emp as select * from scott.emp;

 

Table created.

 

SQL> select * from emp where empno=1;

 

no rows selected

 

SQL> select /*+ MACLEAN */ * from emp where empno=1;

 

no rows selected

 

SQL> select SQL_ID,version_count from V$SQLAREA WHERE SQL_TEXT like '%MACLEAN%' and SQL_TEXT not like '%like%';

 

SQL_ID        VERSION_COUNT

------------- -------------

bxnnm7z1qmg26             1

 

SQL> select count(*) from v$SQL where SQL_ID='bxnnm7z1qmg26';

 

  COUNT(*)

----------

         1

 

SQL> alter session set optimizer_index_cost_adj=99;

 

Session altered.

 

SQL> select /*+ MACLEAN */ * from emp where empno=1;

 

no rows selected

 

SQL> select SQL_ID,version_count from V$SQLAREA WHERE SQL_TEXT like '%MACLEAN%' and SQL_TEXT not like '%like%';

 

SQL_ID        VERSION_COUNT

------------- -------------

bxnnm7z1qmg26             2

 

SQL> select count(*) from v$SQL where SQL_ID='bxnnm7z1qmg26';

 

  COUNT(*)

----------

         2

 

SQL> select child_number ,OPTIMIZER_ENV_HASH_VALUE,PLAN_HASH_VALUE from v$SQL where SQL_ID='bxnnm7z1qmg26';

 

CHILD_NUMBER OPTIMIZER_ENV_HASH_VALUE PLAN_HASH_VALUE

------------ ------------------------ ---------------

           0               3704128740      3956160932

           1               3636478958      3956160932

 

 

可以看到上述 演示中修改optimizer_index_cost_adj=99 导致CBO 优化器的优化环境发生变化, 表现为不同的OPTIMIZER_ENV_HASH_VALUE,之后生成了2个子游标,但是这2个子游标的PLAN_HASH_VALUE同为3956160932,则说明了虽然是不同的子游标但实际子游标里包含了的执行计划是一样的;  所以请注意 任何一个优化环境的变化 (V$SQL_SHARED_CURSOR)以及相关衍生的BUG 都可能导致子游标无法共享,虽然子游标无法共享但这些子游标扔可能包含完全一样的执行计划,这往往是一种浪费。

注意V$SQLAREA.VERSION_COUNT 未必等于select count(*) FROM V$SQL WHERE SQL_ID=”  ,即 V$SQLAREA.VERSION_COUNT 显示的子游标数目 未必等于当前实例中还存有的子游标数目, 由于shared pool aged out算法和其他一些可能导致游标失效的原因存在,所以子游标被清理掉是很常见的事情。 V$SQLAREA.VERSION_COUNT只是一个计数器,它告诉我们曾经生成了多少个child cursor,但不保证这些child 都还在shared pool里面。

此外可以通过v$SQLchild_number字段来分析该问题,如果child_number存在跳号则也说明了部分child被清理了。

 

 

子游标过多的影响, 当子游标过多(例如超过3000个时),进程需要去扫描长长的子游标列表child cursor list以找到一个合适的子游标child cursor,进而导致cursor sharing 性能问题 现大量的Cursor: Mutex S library cache lock等待事件。

关于子游标的数量控制,可以参考《11gR2游标共享新特性带来的一些问题以及_cursor_features_enabled、_cursor_obsolete_threshold和106001 event

 

Executions :  SQL在快照时间内累计执行的次数

 

Hash Value :  共享SQL 的哈希值

 

Only Statements with Version Count greater than 20 are displayed    注意该环节仅列出version count > 20的语句

 

3.9 SQL ordered by Cluster Wait Time

  • %Total - Cluster Time as a percentage of Total Cluster Wait Time
  • %Clu - Cluster Time as a percentage of Elapsed Time
  • %CPU - CPU Time as a percentage of Elapsed Time
  • %IO - User I/O Time as a percentage of Elapsed Time
  • Only SQL with Cluster Wait Time > .005 seconds is reported
  • Total Cluster Wait Time (s): 383
  • Captured SQL account for 80.4% of Total

Cluster Wait Time (s)

Executions

%Total

Elapsed Time(s)

%Clu

%CPU

%IO

SQL Id

SQL Module

SQL Text

92.33

216

24.09

739.55

12.48

34.79

58.01

otcd.tsk@PCMSAPP01 (TNS V1-V3)

Begin PROCESS_CSTP_AUTO_IMPORT...

92.30

96

24.08

708.94

13.02

32.04

60.46

otcd.tsk@PCMSAPP01 (TNS V1-V3)

SELECT C.*, W.AUTO_CSTP, W.AUT...

88.75

168

23.16

1,694.57

5.24

49.14

48.11

otcd.tsk@PCMSAPP01 (TNS V1-V3)

select 'ROW::'||MESSAGE from t...

 

该环节的数据主要来源 于 DBA_HIST_SQLSTAT.CLWAIT_DELTA Delta value of cluster wait time

Cluster Wait Time :   SQL语句累计执行过程中等待在集群等待上的时间,单位为秒, 你可以理解为 当一个SQL 执行过程中遇到了gc buffer busygc cr multi block request 之类的Cluster等待,则这些等待消耗的时间全部算在 Cluster Wait Time里。

Executions :  SQL在快照时间内累计执行的次数

%Total:  SQL所消耗的Cluster Wait time 占 总的Cluster Wait time的比率, 为(SQL cluster wait time / DB total cluster Wait Time)

%Clu: SQL所消耗的Cluster Wait time 占该SQL 总的耗时的比率,为(SQL cluster wait time / SQL elapsed Time),该指标说明了该语句是否是集群等待敏感的

% CPU   SQL 所消耗的CPU 时间 占 该SQL消耗的时间里的比例, 即 (SQL CPU Time / SQL Elapsed Time) ,该指标说明了该语句是否是CPU敏感的

%IO SQL 所消耗的I/O 时间 占 该SQL消耗的时间里的比例, 即(SQL I/O Time/SQL Elapsed Time) ,该指标说明了该语句是否是I/O敏感的

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30935525/viewspace-2087193/,如需转载,请注明出处,否则将追究法律责任。

上一篇: RDA简单使用
下一篇: RDA在RAC上的使用
请登录后发表评论 登录
全部评论

注册时间:2016-02-29

  • 博文量
    41
  • 访问量
    67700