【云和恩墨大讲堂】SQL玩转AWR裸数据

编辑手记:Oracle线上嘉年华第四讲,SQL玩转AWR裸数据,教你真正利用AWR中的裸数据对系统性能进行分析并调优。

作者简介:

罗海雄

云和恩墨优化专家

ITPUB论坛数据库管理版版主,2012 ITPUB全国SQL大赛冠军得主,他还是资深的架构师和性能优化专家,对 SQL 优化和理解尤其深入;从开发到性能管理,他有着超过10年的企业级系统设计和优化经验。曾经服务于甲骨文公司,组织和主讲过多次《甲骨文技术开发人员日》和《Oracle圆桌会议》,并具备丰富的制造行业系统架构经验。

今天的主题是SQL玩转AWR裸数据。 

AWR相信DBA们都不陌生。Automatic Workload Repository,自动负载信息库,就是Oracle把数据库中比较重要的性能视图里的信息,定期从内存保存到数据库里面。默认情况下,Oracle 会每个一个小时保存一次。另外,Oracle也有机制保证信息库的大小不至于无限增长,所以一般信息库只保留7天的数据。默认是保存在SYSAUX表空间中。主要的信息涵盖了Oracle较重要的性能相关信息。

底层存储为WRH$* 表, 通常可通过DBA_HIST_*访问,总共有100多张表。

对于AWR, 常规的用法是生成AWR或者ASH报告。

下面列举了几个最常见的方法。

  • @?/rdbms/admin/awrrpt.sql  -- 标准报告,特定时间段内总体性能报告
  • @?/rdbms/admin/awrddrpt.sql  -- 对比报告,两个时间段内性能对比
  • @?/rdbms/admin/ashrpt.sql  -- ASH报告,特定时间段内历史会话性能报告
  • @?/rdbms/admin/awrsqrpt.sql  -- SQL报告,特定时间段内SQL性能报告

AWR/ASH报告很不错,但也有一些缺陷。

  • 首先,AWR反应的是点对点的数据。比如说,我生成一个今天9:00到12:00的AWR报告,那么,我看到的,就是12:00和9:00两个时间点的变化。但是,9:00-10:00, 10:00-11:00,11:-12:00 分别是什么样的,我们看不到。
  • 另外一个问题,AWR把数据都罗列出来,但却缺乏数据间的联系.
  • AWR混入大量无用数据, 导致生成AWR报告需要30秒到几分钟的时间,所以,如果我们有裸数据,其实可以更高效,更深入的挖掘Oracle数据库的性能信息。在正式接触裸数据前,我们需要先了解AWR在数据库里存的是什么样的数据。

在裸数据里面,记录的各种指标主要有4类

最多的一种是"累计值"
举个例子 dba_hist_sysstat 里会记录数据库的逻辑读。记录的不是这一个小时产生的逻辑读,而是从数据库启动到产生快照的时候的总的逻辑读。这就叫累计值,大多数的指标的是累计值。

也有部分数据记录的是"当前值"

比如说,数据库当前的PGA使用量,数据库的会话数等,还有比较特殊的,会记录两次快照之间的变化值。我们可以认为,这是一种预计算,最常见的记录变化值的两类数据,分别是SQL相关统计信息,以及段(segment)相关统计信息,当然,SQL/Segment记录变化值的同时,也记录了累计值。

还有一类,记录的是”统计值“

就是把一段时间内的数据,做了统计之后保存了起来,这些主要是METRIC类的数据。比如说,每秒CPU, 每秒最大等待时间等。

对于DBA来说,最关心的一般是变化值
两次快照之间的变化量。这是一个简单的SQL, 获取数据库的历史性能信息里的redo size 信息

select SNAP_ID,STAT_NAME,VALUE from DBA_HIST_SYSSTAT

where STAT_NAME=‘redo size’ order by snap_id;

我们现在看到的,就是累计值。那么,怎么方便的获取变化值呢?

1、要取得变化值,需要取出后面的记录,减去前面的记录。

如果仅仅是两个时间点,最简单的方法就是访问这个表两次,然后相减。 

select a.value - b.value from DBA_HIST_SYSSTAT A,DBA_HIST_SYSSTAT B

where A.STAT_NAME=‘redo size’and A.STAT_NAME = B.STAT_NAME and a.snap_id = 123 and b.snap_id = 122

这样得到是两个点之间的差值,但是对我们来说,玩玩是不够的。

2、有时候,我们希望得到一个时间段内,每两个连续快照之间的变化值。比如说,9:00-21:00, 我们希望获得 9:00-10:00, 10:-11:00... 20:00-21:00, 每个时间段分别的变化值。

这里就涉及到Oracle的分析函数了分析函数

Oracle的分析函数提供了在一个结果集内,跨行访问数据的能力。分析函数里面的LEAD/LAG正是跨行获取数据的利器

LAG : 同一组内,排在当前行之前的数据

LEAD : 同一组内,排在当前行之后的数据

如图所示,可以看到,我们要的是拿当前value 减去 lag value。

select snap_id,stat_name,

 value-lag(value)  over

(partition by stat_name order by snap_id)

  from dba_hist_sysstat

 where stat_name = 'redo size'

  order by snap_id;

这就是分析函数LAG的完整语法。

3、我们一般不会满足获取一个指标的变化值的,下面的表,才是我们希望获得的。

这里又引入了进阶SQL的另一个写法:行列转换。

具体我就不细讲了,大家可以体会一下,如何使用sum(case when .. then .. end )或者max(case when .. then .. end )的形式的形式来进行行列转换

,但用Case when来写行列转换,很容易使SQL冗长,而且容易出错。

Oracle 11g中,提供了更方便的方式进行行列转换

大家可以看到,标黄大写的PIVOT, 正是Oracle 11g中引入的行列转换利器。使用PIVOT, 增减指标极其简单:

很轻松就加了两个指标,如果觉得列名不好看,也可以自己指定。

其实,我们可以很轻松的就把AWR报告中的"Load Profile"部分通过行列转换给取出来,而且,是多个连续变化的值。

把跑的结果拷到Excel, 很容易就出来一个漂亮的趋势图。

但是,这个图是有问题的:图里的REDO Size是以byte为单位的,值太大,把别的指标统统压到和0差不多,多个指标要到同一个图,还能看出各自的趋势,对于多指标关联的分析很有作用。

这时候,又有一个分析函数出来了。没错,因为我们是在对Oracle的性能数据进行分析,所以,需要大量的使用”分析函数“

分析函数: Ratio_To_Report 求当前行数据在所有同组数据内占的比例。比如说,我的结果集里有3行,分别是1,3,6. 那么1对应的那一行,占总数据(1+3+6)的10%, 出来的结果就是0.1(10%).

select * from (

 select snaptime,RATIO_TO_REPORT(value) over(partition by stat_name) value,stat_name,snap_id 

 from (… )) PIVOT (sum(value) for stat_name in (

…))order by snap_id;

在这个图里面,大家就都平等了,也更方便的去看各个指标之间是否存在关联

再给大家看另一个SQL, 还是ratio_to_report, 这次,我们拿到的结果,其实是AWR报告里另一个非常重要的数据:Top Timed Events

我把每个时间段的CPU时间和非空闲事件给放在一起,然后计算每个事件(含CPU)在每个时间段占的百分比,就得到 Top Timed Events,而且是连续的多个时间的数据。

今天的分享到此结束,更多精彩,尽在Oracle线上嘉年华。敬请关注!

文章转自数据和云公众号,原文链接

时间: 2024-09-08 21:18:52

【云和恩墨大讲堂】SQL玩转AWR裸数据的相关文章

【云和恩墨大讲堂】复合索引与绑定变量

编辑手记:2016 Oracle 技术嘉年华活动已经结束,为了让更多的技术爱好者有机会获取大会干货资源,我们将不断邀请演讲嘉宾展开"2016 Oracle 线上嘉年华". 讲师简介 邓秋爽(小鱼) 云和恩墨专家,有超过5年超大型数据库专业服务经验,擅长oracle 数据库优化.SQL优化和troubleshooting 今晚的恩墨大讲堂将有我为大家分享SQL审核中的两个典型案例,如下: 1复合索引前导列选择 2绑定变量分享--某业务SQL性能问题分析 在介绍这两个case之前先对目前我

【云和恩墨大讲堂】Oracle线上嘉年华第二讲

编辑手记:Oracle线上嘉年华,正在持续分享中.本次的主题是系统割接中的SQL解析问题和结合业务的SQL优化改写技巧. 1嘉宾介绍 小鱼(邓秋爽) 云和恩墨专家,有超过5年超大型数据库专业服务经验,擅长oracle 数据库优化.SQL优化和troubleshooting 新系统割接的library cache问题 这是我们在做系统割接的时候的一个案例,可能并不是很常见,这个案例是将Oracle 11g升级到12c的时候遇到的问题,出现了大量的library cache的问题.具体情况是: 新系

【云和恩墨大讲堂电子期刊】挑战者:Google成功的背后

致亲爱的读者: 在商业竞争中,进攻常常也是最好的防守.Google从小到大一直贯彻这个原则.Google在规模很小的时候,受到很多比自己大的公司的围攻,死守是没有出路的.因此它把自己放在一个挑战者的位置,不断挑战对手,也挑战自己.在商业竞争中,Google常常是两眼盯着前方向前冲,而不左顾右盼它的对手. 这段话摘自<浪潮之巅>,也是我认为对于Google成功的背后最好的阐释.Google公司从一开始就以挑战者的身份出现在人们的视野中,它不仅在技术和商业上挑战比自己更大更强的公司,而且在理念上挑

【云和恩墨大讲堂】从执行计划洞察ORACLE优化器的“小聪明”

作者简介黄浩  惠普 十年一剑,十年磨砺.3年通信行业,写就近3万条SQL:5年制造行业,遨游在ETL的浪潮:2年性能优化,厚积薄发自成一家 主题介绍: Oracle执行计划的另类解读:调皮的执行计划 | 诚实的执行计划 | 朴实的执行计划 说到执行计划,oracle的拥趸们自然而然会兴奋起来.在ORACLE的世界里,执行计划有着其特殊的地位,如果我们将SQL性能优化看成一个生物,那某种程度上,执行计划就是DNA.在某搜索网站中,"oracle 执行计划"关键字的搜索结果与"

云和恩墨助力东风日产Exadata一体机核心系统

东风日产乘用车公司成立于2003年6月16日,是东风汽车有限公司旗下重要的乘用车板块,从事乘用车研发.采购.制造.销售.服务业务,是国内为数不多的具备全价值链的汽车生产企业. 自成立开始到 2014 年 8 月,东风日产累计整车产销量已突破 550 万辆,刷新行业最快纪录.在 2015 年,东风日产四大基地整车总产能有望从现有的 100 万辆提升至 150 万辆. 东风日产技术中心,是日产汽车公司在全球第四个具有同等研发平台的技术中心,是中国华南地区最大的乘用车技术中心,通过与世界同步的研发,不

【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)

原创 2016-09-12 熊军  [云和恩墨]性能优化:Linux环境下合理配置大内存页(HugePage) 熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 PC Server发展到今天,在性能方面有着长足的进步.64位的CPU在数年前都已经进入到寻常的家用PC之中,更别说是更高端的PC Server:在Intel和AMD两大处理器巨头的努力下,x86 CPU在处理能力上不断提升:同时随着制造工艺的发展,在PC Server上能够安装的内存容量也越来越大,现在随处

《Oracle性能优化与诊断案例精选》——1.5 云和恩墨,数据服务起征途

1.5 云和恩墨,数据服务起征途 时至今日,IT这个行业仍然是最为吸引毕业生的一个重要行业.记得多年前榕树下的一位朋友"落花如雨"说过一句话:喜欢这个行业,因为这个行业里汇聚了这个时代最聪明的人才与最快速增长的财富. 就因为这两点,众多的年轻人前仆后继的开始涌入这个圈子.那么然后,出路又在何方呢?一直以来大家都认为,程序员或者IT领域是年轻人的天下,因为这里有变换迅速的技术和产品,而机遇和压力一直是呈正比增加的. 我也开始探索作为技术人的出路,云和恩墨就是这样一个开始,如图1-8所示.

云和恩墨助东风日产Exadata一体机营销核心系统

东风日产乘用车公司成立于2003年6月16日,是东风汽车有限公司旗下重要的乘用车板块,从事乘用车研发.采购.制造.销售.服务业务,是国内为数不多的具备全价值链的汽车生产企业. 自成立开始到2014年8月,东风日产累计整车产销量已突破550万辆,刷新行业最快纪录.在2015年,东风日产四大基地整车总产能有望从现有的100万辆提升至150万辆. 服务简介 2015年度,东风日产发布多款新车型,业务部门提出更高的追求.为了支持业务的快速发展,信息部门采购OracleExadata一体机作为核心交易系统

【云和恩墨】内外兼修:Oracle ACED熊军谈Oracle学习

原创 2016-07-07 熊军  编辑手记:熊军是中国西部第一位,也是到目前为止唯一的Oracle ACE总监,在这篇文章中熊军描述了他的学习过程和理念供大家参考. ORACLE 的学习,就好比武侠小说中学武功.要从三方面入手: 1.内功:针以学习 ORACLE 来说,内功就是对基本概念的掌握,ORACLE 架构的深入理解,原理的掌握.如果有兴趣和时间,研究一下 Internal 的东西,这好比修习易筋经,需要极大的毅力和长期的坚持. 2.招式:如果光有内功,没有招式,则会陷入空有高深内力,却