如何分析AWR 报告

article/2025/9/1 20:09:13

Automatic Workload Repository是10g引入的一个重要组件。在里面存贮着近期一段时间内,默认是7天,数据库活动状态的详细信息。

AWR报告是对AWR视图进行查询而得到的一份自动生成的报告。可以通过下面的脚本手工得到一份AWR报告。

 

         exec dbms_workload_repository.create_snapshot;  

          ... running the specified workload 

          exec dbms_workload_repository.create_snapshot;  

           @?/rdbms/admin/awrrpt

通过AWR和AWR报告,DBA可以容易地获知最近数据库的活动状态,数据库的各种性能指标的变化趋势曲线,最近数据库可能存在的异常,分析数据库可能存在的性能瓶颈从而对数据库进行优化。

AWR报告所有的数据来源于AWR视图,即以DBA_HIST_开头的所有系统表,Database Reference有对所有这些系统表的描述,这应该是Oracle官方对AWR报告的官方注释了。

而对于如何有效地去分析AWR报告,这可能更需要DBA经验的日积月累。

AWR的前身是Statspack,Statspack在10g和11g中也有提供,同时和AWR一起做了同步更新,而且Statspack是公开源代码的,因此,关于Statspack的资料,还有Statspack的源代码,都是理解AWR的一个有用的辅助。

 

如果关注数据库的性能,那么当拿到一份AWR报告的时候,最想知道的第一件事情可能就是系统资源的利用情况了,而首当其冲的,就是CPU。

而细分起来,CPU可能指的是

  1. OS级的User%, Sys%, Idle%
  2. DB所占OS CPU资源的Busy%
  3. DB CPU又可以分为前台所消耗的CPU和后台所消耗的CPU

如果数据库的版本是11g,那么很幸运的,这些信息在AWR报告中一目了然:

 

如何分析AWR - elliptic - 心事

 

OS级的%User为75.4,%Sys为2.8,%Idle为21.2,所以%Busy应该是78.8。

DB占了OS CPU资源的69.1,%Busy CPU则可以通过上面的数据得到:
%Busy CPU = %Total CPU/(%Busy) * 100 = 69.1/78.8 * 100 = 87.69,和报告的87.7相吻合。

如果是10g呢,则需要手工对Report里的一些数据进行计算了。

Host CPU的结果来源于DBA_HIST_OSSTAT,AWR 报告里已经帮忙整出了这段时间内的绝对数据(这里的时间单位是centi second,也就是1/100秒)

 

如何分析AWR - elliptic - 心事

 

这里,

%User = USER_TIME/(BUSY_TIME+IDLE_TIME)*100 = 146355/(152946+41230)*100 = 75.37

%Sys  = SYS_TIME/(BUSY_TIME+IDLE_TIME)*100

%Idle = IDLE_TIME/(BUSY_TIME+IDLE_TIME)*100

值得注意的,这里已经隐含着这个AWR报告所捕捉的两个snapshot之间的时间长短了。有下面的公式

BUSY_TIME + IDLE_TIME = ELAPSED_TIME * CPU_COUNT

正确的理解这个公式可以对系统CPU资源的使用及其度量的方式有更深一步的理解。

因此ELAPSED_TIME = (152946+41230)/8/100 =  242.72 seconds

当然,这正确无误。

至于DB对CPU的利用情况,这就涉及到10g新引入的一个关于时间统计的视图了, v$sys_time_model,简单而言,Oracle采用了一个统一的时间模型对一些重要的时间指标进行了记录,具体而言,这些指标包括:

 

1) background elapsed time

    2) background cpu time

          3) RMAN cpu time (backup/restore)

1) DB time

    2) DB CPU

    2) connection management call elapsed time

    2) sequence load elapsed time

    2) sql execute elapsed time

    2) parse time elapsed

          3) hard parse elapsed time

                4) hard parse (sharing criteria) elapsed time

                    5) hard parse (bind mismatch) elapsed time

          3) failed parse elapsed time

                4) failed parse (out of shared memory) elapsed time

    2) PL/SQL execution elapsed time

    2) inbound PL/SQL rpc elapsed time

    2) PL/SQL compilation elapsed time

    2) Java execution elapsed time

    2) repeated bind elapsed timea

我们这里关注的只有和CPU相关的两个: background cpu time 和 DB CPU。

这两个值在AWR里面也有记录:

image

Total DB CPU = DB CPU + background cpu time = 1305.89 + 35.91 = 1341.8 seconds

再除以总的 BUSY_TIME + IDLE_TIME

% Total CPU = 1341.8/1941.76 = 69.1%,这刚好与上面Report的值相吻合。

其实,在Load Profile部分,我们也可以看出DB对系统CPU的资源利用情况。

image

用DB CPU per Second除以CPU Count就可以得到DB在前台所消耗的CPU%了。

这里 5.3/8 = 66.25 %

比69.1%稍小,说明DB在后台也消耗了大约3%的CPU,这是不是一个最简单的方法了呢?

 

DB CPU,这是一个用于衡量CPU的使用率的重要指标。假设系统有N个CPU,那么如果CPU全忙的话,一秒钟内的DB CPU就是N秒。

如何去表征一个系统的繁忙程度呢?除了利用CPU进行计算外,数据库还会利用其它计算资源,如网络,硬盘,内存等等,这些对资源的利用同样可以利用时间进行度量。假设系统有M个session在运行,同一时刻,有的session可能在利用CPU,有的session可能在访问硬盘,那么,在一秒钟内,所有session的时间加起来就可以表征系统在这一秒内的繁忙程度,一般的,这个和的最大值应该为M。这其实就是Oracle提供的另一个重要指标:DB time,它用以衡量前端进程所消耗的总时间。

对除CPU以后的计算资源的访问,Oracle用等待事件进行描述。同样地,和CPU可分为前台消耗CPU和后台消耗CPU一样,等待事件也可以分为前台等待事件和后台等待事件。

DB Time一般的应该等于DB CPU + 前台等待事件所消耗时间的总和。等待时间通过v$system_event视图进行统计,DB Time和DB CPU则是通过同一个视图,即v$sys_time_model进行统计。

Load Profile一节就有了对DB Time的描述:

image

这个系统的CPU个数是8,因此我们可以知道前台进程用了系统CPU的7.1/8=88.75%。DB Time/s为11.7,可以看出这个系统是CPU非常繁忙的。里面CPU占了7.1,则其它前台等待事件占了11.7 – 7.1 = 4.6 Wait Time/s。DB Time 占 DB CPU的比重呢? 7.1/11.7= 60.68%

Top 5 Timed Events,或许很多人都对它有所耳闻,按照CPU/等待事件占DB Time的比例大小,这里列出了Top 5。如果一个工作负载是CPU繁忙型的话,那么在这里应该可以看到 DB CPU的影子。

image

注意到,我们刚刚已经算出了DB CPU 的%DB time,60%。

其它的external table read, direct path write, PX Deq: read credit, PX Deq: Slave Session Stats这些就是占比重40的等待事件里的Top 4了。

回过头再再研究下这个Top 5 Timed Foreground Events,如果先不看Load Profile,你能说出这个一个CPU-Bound的工作负载吗?

答案是否定的,要知道系统CPU的繁忙程序,还要知道这个AWR所基于两个snapshot的时间间隔,还要知道系统CPU的个数。要不,系统可以是一个很IDLE的系统呢。记住CPU利用率 = DB CPU/(CPU_COUNT*Elapsed TIME)。

这个Top 5 给我们的信息只是这个工作负载应该是并行查询,从外部表读取数据,并用insert append的方式写入磁盘,同时,主要时间耗费在CPU的运算上。

上面提到,DB Time一般的应该等于DB CPU + 前台等待事件所消耗时间的总和。在下面有对这三个值的统计:

image

  • DB CPU = 6474.65
  • DB TIME = 10711.2
  • FG Wait Time = 1182.63

明显的,DB CPU + FG Wait Time < DB Time,只占了71.5%

其它的28.5%被消耗到哪里去了呢?这里其实又隐含着一个Oracle如何计算DB CPU和DB Time的问题。当CPU很忙时,如果系统里存在着很多进程,就会发生进程排队等待CPU的现象。在这样,DB TIME是把进程排队等待CPU的时间算在内的,而DB CPU是不包括这一部分时间。这是造成 DB CPU + FG Wait Time < DB Time的一个重要原因。如果一个系统CPU不忙,这这两者应该就比较接近了。

不要忘了在这个例子中,这是一个CPU非常繁忙的系统,而71.5%就是一个信号,它提示着这个系统可能是一个CPU-Bound的系统。

 

 

 

 

除了DB CPU,DB Time,或许另一个比较常用的指标应该是IO的利用情况。关于IO的指标就比较多了,单单在Load Profile里面就有5个,在DB Time和DB CPU的下面:

image

这5个指标的值都来自v$systat视图,分别是:

  • Redo Size: ‘redo size’
  • Logical reads = ’session logical reads’ or (’db block gets’ + ‘consistent gets’)
  • Blocks Changes = ‘db block changes’
  • Physical reads = ‘physical reads’
  • Physical writes = ‘physical writes’

具体指标的解释参考Database Reference.

如何得到系统大致的MBPS呢?

MBPS= (Physical reads + Physical writes) * Block_Size = (196,271.4+2.0)*8*1024/1024/1024 = 1533 MB/s

更准确的MBPS可以从Instance Activity Stats部分获得。

image

physical IO disk bytes = physical read total bytes + physical write total bytes

值得注意的是这里physical write total bytes大致是physical write bytes的两倍。这应该是physical write total bytes统计的是磁盘的IO,而这里,我们做了ASM,normal redundancy,一份数据写了两遍的原因。

Load Profile剩下的部分主要是关于各种执行情况的统计,除了W/A MB processed来自v$pgastat(单位其实也是Byte,不是MB),其它数据都是来自于v$sysstat。

  • Blocks Changes: ‘db block changes’
  • User calls:  ‘user calls’
  • Parses: ‘parse count (total)’
  • Hard parses: ‘parse count (hard)’
  • Logons: ‘logons cumulative’
  • Executes:  ‘execute count’
  • Rollbacks: ‘user rollbacks’
  • Tranasactions: ‘user rollbacks’ + ‘user commits’
  • W/A MB processed: ‘bytes processed’

一般而言,Hard parses < Parses < Executes < User Calls。

AWR的一般性介绍我想差不多就这些了,其它部分的介绍借助于一些更具体的AWR报告进行分析可能会更加方便和清晰。

 

 

 

 

 

如果这个系列是按“总-分-总”组织的话,接下来的系列应该是进行“分”这一部分了。

构建DSS系统的第一步离不开数据加载,通过文本文件加载是最常见的方式,Oracle提供了外部表加载的方法,即把一个文本文件当成一个正常的表来进行操作,通过类似insert /*+ append */ into table select from external_table的方式进行加载。

数据加载是一个CPU-Bound的过程,不过是通过什么工具,external table也好,sqlldr也好,imp也好,impdp也好。换句话说,如果连数据加载都出现IO瓶颈,这个系统的配置就说不过去了。

这个过程的AWR报告会是怎么样子的呢?

先做个一般的假定,从外部表加载数据到一个本地分区表。

Top 5 Timed Events类似下面:

image

如果去抓取这段时间DBA_HIST_ACTIVE_SESS_HISTORY的数据,并转换为图表的话,我们会得到更形象的Top 10 Wait Events.

(如何实现这一步可以参考用Oracle实现ASH的数据透视图)

image

enq: HV – contention是什么东西呢?

在11.2以前,对于分区表的parallel direct-path load,Oracle采用的是brokered load的方式,即所有的PX Slaves共享对每个分区的high water mark的访问,通过轮流持有high water mark实现对每个segment添加新的blocks。这种方法对于充分利用extent的空间是有帮助的,不过带来的问题就是对high water mark的竞争,也就是这里的enq: HV – contention。在执行计划中,这以RANDOM LOCAL 标记。下面是一个例子:

--------------------------------------------------------------------------------------------------------------------------  | Id  | Operation                        | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |  --------------------------------------------------------------------------------------------------------------------------  |   0 | INSERT STATEMENT                 |          |  8168 |    14M|     2   (0)| 00:00:01 |        |      |            |  |   1 |  PX COORDINATOR                  |          |       |       |            |          |        |      |            |  |   2 |   PX SEND QC (RANDOM)            | :TQ10001 |  8168 |    14M|     2   (0)| 00:00:01 |  Q1,01 | P-&gt;S | QC (RAND)  |  |   3 |    LOAD AS SELECT                | TAB      |       |       |            |          |  Q1,01 | PCWP |            |  |   4 |     PX RECEIVE                   |          |  8168 |    14M|     2   (0)| 00:00:01 |  Q1,01 | PCWP |            |  |   5 |      PX SEND RANDOM LOCAL        | :TQ10000 |  8168 |    14M|     2   (0)| 00:00:01 |  Q1,00 | P-&gt;P | RANDOM LOCA|  |   6 |       PX BLOCK ITERATOR          |          |  8168 |    14M|     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |  |   7 |        EXTERNAL TABLE ACCESS FULL| ET_TAB   |  8168 |    14M|     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |  --------------------------------------------------------------------------------------------------------------------------

一个好消息是,11.2引入了一种新的方式,叫做PKEY distribution。在这种方式下,一个特定的分区只交给一个或多个特定的PX slave负责,这种方式不仅减少了对high water mark的争用,而且可以实现partition内更好的压缩率。

 

有一次跟一个QQ上的朋友一起探讨了另一个对系统CPU进行度量的指标: CPU used by this session。

他刚好有一份AWR报告,在这份报告里,出现了严重的CPU used by this session和DB CPU不一致的现象。

下面是这份报告的一些片断

image

image

image

image

再做进一步的归纳:

OS Busy% = 1821080/(1821080+5384293) = 25%

Inst CPU% (using DB CPU) = 8934.22*100/(1821080+5384293)=12%

Inst CPU% (using CPU used by this session) = 418035/(1821080+5384293) = 6%

用CPU used by this session计算出的CPU利用率竟然只是用DB CPU计算出来的利用通率的一半!

我的第一个反应是在Jonathan lewis网站看到的一篇相关文章,里面提到了DB CPU和CPU used by this session计算时的不同之处:

“prior to 10g Oracle usually updated time figures at the end of each database call; but from 10g there are some views where time is updated more regularly.

The “DB CPU” from v$sess_time_model increases every six seconds, while the “CPU used by this session” from v$sesstat changes only at the end of the test.”

如何验证这一点呢?

在浏览这份报告的TOP SQL时,我们发现了下面的现象:

image

这是从SQL ordered by Elapsed Time截取出来的Top 3 SQL。TOP 1的SQL用了DB Time的30.10%,用了2517s 的CPU Time。但请注意它的Executions的值却为0。也就是说,这里的CPU Time是还没有被计算入CPU used by this session这个指标里面的。

我们再把2517s加回来,看出误差缩小多少:(251700+418035)/(1821080+5384293) = 9%

这时和用DB CPU计算出来的12%还是有1/4的差距。

从这个例子可以看出,用DB CPU度量还是比用CPU used by this session来得准确的。特别在有大查询在跑的过程中抓的AWR,这个误差很有可能会被放大。

一个有趣的实际例子

 

转自:http://www.cnblogs.com/HondaHsu/archive/2012/09/26/2703551.html


http://chatgpt.dhexx.cn/article/AewmBwFH.shtml

相关文章

oracle 取awr报告,Oracle生成awr报告

Oracle生成awr报告 达芬奇的梦 2018-04-22 21:28:32 Oracle 一、手工生成awr报告的方法 1、相应权限用户登录(sysdba)后,在$ORACLE_HOME/rdbms/admin 2、在sqlplus里执行@?/rdbms/admin/awrrpt.sql,按照提示操作。 3、生成AWR报告说明 单实例:@$ORACLE_HOME/rdbms/admin/aw…

Oracle SQL调优系列之AWR报告简介

文章目录 一、AWE报告生成步骤1.1 工具选择1.2 自动创建快照1.3 手工创建快照1.4 生成AWR报告 二、AWR报告分析2.1 AWR之DB Time2.2 AWR之load_profile2.3 AWR之efficiency percentages2.4 AWR之top 10 events2.5 AWR之SQL Statistics 一、AWE报告生成步骤 对于SQL调优&#x…

AWR报告解读

0 初步结论 ① 数据库CPU资源不够&#xff0c;CPU使用率较高&#xff0c;造成CPU等待时间较长&#xff0c;可适当提升CPU资源&#xff1b; ② 数据库I/O资源消耗不太大&#xff0c;不存在IO瓶颈&#xff1b; ③ 可适当调大SGA空间&#xff08;增加10G左右&#xff09;&#xf…

用sql统计vintage,滚动率,迁移率,逾期率

获取代码请移步&#xff1a;用sql统计vintage&#xff0c;滚动率&#xff0c;迁移率&#xff0c;逾期率

如何用R语言做Vintage分析

一、背景 Vintage一词源自葡萄酒业&#xff0c;意思是葡萄酒酿造年份。因为每年的天气、温度、湿度、病虫害等情况不同&#xff0c;而这些因素都会对葡萄酒的品质产生很大的影响&#xff0c;所以人们对葡萄酒以葡萄当年的采摘年份进行标识来加以品质区分。现在Vintage分析被广泛…

风控中必做的数据分析

大数据领域就没有不做数据分析的&#xff0c;大数据风控也不例外。 我的观点是风控和其他互联网业务都是互通的&#xff0c;本文介绍下风控中必做的数据分析&#xff0c;用以说明数据分析是一通百通的。 工欲善其事&#xff0c;必先利其器。先说下数据分析的工具。 分析工具…

Vintage、滚动率、迁移率的应用

更多风控建模、大数据分析等内容请关注公众号《bigdatafengkong》 BY 小石头 一、Vintage Vintage源于葡萄酒酿造&#xff0c;葡萄酒的品质会因葡萄生长的年份不同、气候不同而不同。Vintage分析是指评估不同年份的葡萄酒的品质随着窖藏时间的推移而发生的变化&#xff0c;并且…

窗口函数:vintage报表

0 前言 Vintage这个词原意是指酿造葡萄酒的酒窖。葡萄酒是讲究年份&#xff0c;哪年光景好&#xff0c;哪年光景不好&#xff0c;直接会影响到葡萄酒的品质。后来借用到信贷资产行业&#xff0c;指的是每个月贷款的资产质量情况&#xff0c;要直接跟每个相同时间段内的余额做比…

信贷风控中Vintage、滚动率、迁移率的理解

风控业务背景 信贷风险管理是一门艺术&#xff0c;更是一门科学。资产质量分析中常会涉及到三个理论&#xff1a; 账龄分析&#xff08;Vintage Analysis&#xff09;&#xff1a;用以分析账户成熟期、变化规律等。滚动率分析&#xff08;Roll Rate Analysis&#xff09;&#…

风控ML[9] | Vintage和Roll Rate 分析的详解

我们说了好几期的风控建模了&#xff0c;也有不少的同学私信我说一般来说我们需要怎么确定Y值呢&#xff1f;&#xff0c;到底多坏的逾期表现的客户可以被我们定义为坏客户呢&#xff1f;今天这篇文章&#xff0c;就给大家介绍一个大家既熟悉又陌生的分析工具——Vintage Analy…

了解过Vintage的N种样式?

vintage的几种形式有没有兴趣了解下&#xff1f; 我们之前写的文章里就提到过一个资产分析报表里的vintage表&#xff0c;这个表是反映客群的账龄情况&#xff0c;如果不是很清楚请再戳进去&#xff1a;风控建模系列&#xff08;六&#xff09;&#xff1a;催收评分卡卡跟贷前…

风控模型策略-知识全整理(一)

做了大概5年风控&#xff0c;中间做过甲方&#xff0c;做过乙方&#xff0c;做过模型&#xff0c;做过策略&#xff0c;做过数据分析&#xff0c;但是始终觉着不得风控精华&#xff0c;做的事情太多&#xff0c;有的东西也就很难深入&#xff0c;目前就是将这么几年的积累写下来…

vintage、滚动率等相关指标介绍

目录 1、vintage 方法简介 优势 五级分类的比较 2、滚动率 3、入催率 4、FPD 随着互联网金融的发展&#xff0c;对数据分析的需求越来越大。数据分析的目的其实是为了找到风险和收益的平衡点。高收益伴随着高风险&#xff0c;而低风险的回报又如同鸡肋。所以&#xff0c;…

对Vintage未表现数据的预测方法总结

这段时间在利用Vintage分析做借贷产品的放款损失率相关工作&#xff0c;来简单总结一下。 Vintage分析 前面说到&#xff0c;Vintage是资产质量分析的重要工具&#xff0c;主要是用来分析同一产品在不同时间放款的资产质量变化情况&#xff0c;从而反映该产品的客群质量和变化…

vintage+android相机,Vintage复古相机

Vintage复古相机是一款功能强大&#xff0c;非常好用的相机软件&#xff0c;这里有着丰富的复古滤镜可以自由选择&#xff0c;并且还可以直接在这里p图修图&#xff0c;各种效果可以提前预览&#xff0c;还可以一键生成保存&#xff0c;非常便捷&#xff01;喜欢拍照的小伙伴不…

一文教你如何解读Vintage

当我们在观测资产最终损失和不同资产的风险差异时&#xff0c;经常会用到一个指标&#xff0c;那就是Vintage。 这个指标的计算和展示与大多数指标有所不同&#xff0c;因为所需要的数据信息并不单来源于某一个固定时间的切片数据&#xff0c;而是来源于历史多个时间节点的切片…

Vintage、滚动率、迁移率的应用(转载)

转载于&#xff1a;http://mp.weixin.qq.com/s?__bizMzIyNDk2MzQ1NQ&mid2247484124&idx1&sneec18c836806b8803845716195fae061&chksme807bcccdf7035da8b5ca7fe81f0a7e2185e2ed37b93eeea2dc992457e10781c0dfe6c27cb48&scene21#wechat_redirect 一、Vintag…

信贷风控中Vintage、滚动率、迁移率

风控业务背景 信贷风险管理是一门艺术&#xff0c;更是一门科学。资产质量分析中常会涉及到三个理论&#xff1a; 账龄分析&#xff08;Vintage Analysis&#xff09;&#xff1a;用以分析账户成熟期、变化规律等。滚动率分析&#xff08;Roll Rate Analysis&#xff09;&…

Vintage分析和迁移率模型在信用卡业务中的应用

随着中国金融业对外开放程度的加大,国内信用卡产业的竞争愈演愈烈,信用卡市场营销的费用也越来越高.如何利用有限的营销资源为发卡机构创造最大利润,实现信用卡营销和风险的精细化管理已成为信用卡产业发展的热门话题.本文通过对国外商业银行在信用卡业务中常用的Vintage分析和…

业务相关--vintage

vintage整理 --------仅用于个人学习知识整理和sas/R语言/python代码整理 ####1 . 前言 Vintage表&#xff0c;将不同时间层面的顾客拉平到同一时间周期上进行比较&#xff0c;观察不同入口时间的顾客在不同生命周期上的表现。 vintage一般有三种用法&#xff1a; 1.横看&…