转载

<让oracle跑得更快-7> AWR性能报告

AWR是oracle 10g下提供的一种性能收集和分析工具,可以看做10g以前statspack工具的一个升级版本,它能够提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解一个系统整个运行情况。

读懂AWR报告并不是简单地通过理解里面的性能指标的含义就能掌握的。需要你相当了解oracle的内部机制,方方面面的内部机制,对oracle理解得越深,看AWR报告后对数据库性能的判断也会越准确。

数据库的性能分析,大致上可以分为两个层面,会话级和系统级(实例级)。

1. 会话级

如果我们能够确定某个会话存在性能问题,那么我们就可以针对这个确定的会话做分析。最常见的分析方式是对这个会话做一个sql_trace或者10046事件,通过分析trace文件来定位问题的所在。

2. 实例级

当我们无法确定哪个会话性能有问题(或者说每个会话性能都有问题)的时候,就需要从实例级别来分析问题的所在,这很有可能是实例整体性能下降导致的。为了获得一个实例的整体性能数据,我们可以查询一些动态视图,比如V$sysstat,V$system_events为了查询实例里的整体性能情况,可能要查询很多方面的信息,比如SQL,比如IO,比如等待,需要查询非常多的视图。针对这种情况,在oracle 10g之前,statspack工具包是做实例级性能分析的首选工具,他能定期收集数据库的性能信息,然后生成报告;在10g里,oracle提供了一个新的性能采集和分析的工具AWR(Automatic Workload Repository),它比statspack收集的信息更多,使用起来更方便。AWR由运行在oracle的后台进程自动,定期收集数据库的性能数据,并将数据保存起来,每一个小时,AWR都会生成一次性能数据快照,为DBA提供某个时刻数据库性能分析的数据信息。

AWR的性能数据是oracle自动采集和保存的,采集周期是1小时,不需要人为干预,我们要做的就是使用这些信息,生成一个AWR性能分析报告。

7.1 生成AWR性能报告

(1)首先进入生成AWR报告使用脚本的路径下,它的位置是:

$ORACLE_HOME/rdbms/admin

我们使用了环境变量$ORACLE_HOME,在每个安装了oracle实例软件的机器上,在oracle默认用户下,都应该设置了这个变量。

(2)然后我们执行以下命令,其中调用的脚本awrrpt.sql就是生成AWR报告用到的脚本:

&lt;让oracle跑得更快-7&gt; AWR性能报告

这一部分显示数据库的ID、数据库名称和当前实例名称。

&lt;让oracle跑得更快-7&gt; AWR性能报告

这里AWR要求我们指定报告的显示方式,默认是HTML方式,也可以直接输出为文本方式。 建议使用HTML方式 ,因为在报告中有一些页面内部有链接,使用HTML可以更容易定位信息,如果不输入,默认值是HTML.

&lt;让oracle跑得更快-7&gt; AWR性能报告

如果运行的系统是一个RAC结构,这一部分会列出所有的实例。

&lt;让oracle跑得更快-7&gt; AWR性能报告

AWR询问要显示最近几天的快照信息,我们输入1表示显示最近一天的快照。

&lt;让oracle跑得更快-7&gt; AWR性能报告

上面列出了最近一天的快照信息,每一个小时AWR生成一个性能快照,我们要指定需要分析性能的时间段,指定一个开始快照号和结束的快照号。

&lt;让oracle跑得更快-7&gt; AWR性能报告

我们指定了开始快照号17218和截止快照号17219,它对应的起止时间是从早上9:00到10:00的一小时的时间间隔。

&lt;让oracle跑得更快-7&gt; AWR性能报告

指定生成的AWR报告的路径和文件名,这里设定的路径是:

/tmp/myawr.html

完成上面的交互式信息输入后,oracle将会为我们在指定的位置生成AWR报告。

另外,oracle还提供了一个脚本awrrpti.sql,使用这个脚本可以直接生成其数据库或者其他实例上的AWR报告。这个脚本对于RAC结构的数据库很有用处,我们直接连接一个实例就可以生成所有实例的AWR性能报告。

7.2 AWR性能报告分析

AWR报告文件里包含了非常多的性能指标,如果我们像读小说一样从头读到尾,几乎可以说是毫无收获,肯定会“读了后面忘了前面”。

用户要根据自己的实际情况来从报告中获取自己需要的信息,比如对于一个 OLTP系统

(1) Library Hit

(2) Buffer Hit

这两项就应该非常关注,因为OLTP系统是一个sql执行非常密集的系统,共享池命中率低就说明有很多sql不能被重用,需要重新解析,这会大大降低系统的性能和sql的执行效率。Buffer hit在OLTP系统中也非常重要。OLTP系统要求sql的执行效率非常高,当sql需要的数据块都能保留在内存中,那么sql执行效率自然要比从磁盘读取数据块要高得多,当这个值越接近于100时,说明内存中sql访问的数据块越多,也就是从磁盘读取的数据块越少。

反之,如果你的系统是一个典型的OLAP系统或数据仓库系统,那么完全可以忽略这两个性能指标,即使他们非常低。因为OLAP系统数据库中通常是运行着一些报表分析的sql,这些sql都是一些聚类查询的sql,这些sql执行时间都非常长,而且每个sql查询的数据块可能都不相同,所以数据块很难长时间地缓存在内存当中;另外,OLAP系统本身执行的sql重复率就不高,不需要要求这些sql重用,甚至在OLAP系统中,绑定变量会导致负面作用。实际上,要把一个AWR报告讲清楚的确是一件非常困难的事,因为每个系统都不同,绝不能一概而论,那些所谓的某些指标必须要达到多少,数据库性能才能优化的说法是没有根据的。

具体每一部分的解读可以参考《让oracle跑得更快 oracle 10g 性能分析与优化思路》第13章。

【完】

已有 0 人发表留言,猛击->> 这里 <<-参与讨论

ITeye推荐

  • —软件人才免语言低担保 赴美带薪读研!—
正文到此结束
Loading...