ORACLE性能AWR报告的使用和分析

更新时间:2023-10-22 14:14:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

ORACLE性能诊断AWR报告的使用和分析

为满足业务的运行要求,高性能要求是目前IT系统普遍面临的最棘手问题,尤其是客户面对着目前越来越庞大系统和数据,系统整合、数据大集中似乎成了趋势。针对系统性能优化的诊断和分析,数据库方向又是其中的重要一环,本文将针对ORACLE中常用的性能诊断工具AWR报告,进行分析说明。

一、 ORACLE性能诊断工具

ORACLE数据库的性能的诊断工具有很多种,在9i之前主要通过手工进行采集分析,例如使用动态视图和Statspack报告来获取数据库性能状态信息,10g以后ORACLE数据库的性能诊断和改进建议越来越自动化,不过能够熟悉并掌握ORACLE的相关性能诊断工具的使用,仍对性能问题的准确和有效处理提供有利的帮助。以下是ORACLE中常用的一些分析工具。

? 动态性能视图

动态性能视图是ORACLE中最常用,也是最简单的一种工具。无论何种性能问题,都能在动态性能视图中找到线索,不过仅10g中动态性能视图就高达几百个,每个视图都包括很多诊断信息,想在众多的视图中找到问题的根源,也是一件费力的事情。一般常用的动态性能视图有:v$session、v$session_wait、v$process、v$sql、v$lock、v$latch、v$sysstat、v$system_event、v$sgastat。

? Statspack报告

statspack 是Oracle 9i 之前使用的一个数据库收集工具,收集了数据库全面信息,包括负载概览、前五个等待事件、高速缓存的大小、共享池中SQL语句、表空间和文件I/O、库高速缓存、SGA统计等。

? AWR和ADDM报告

AWR是10g以后提供的一个新工具,Oracle 建议用户用这个取代 Statspack,它采集与性能相关的统计数据,并从那些统计数据中导出性能量度,以跟踪潜在的问题,并自动生成ADDM(自动数据库诊断监控)报告,为用户提供数据库性能诊断分析建议。

? SQL执行计划和建议

数据库中SQL的执行效率可能是对系统影响最大的一个因素,利用ORACLE执行计划的分析,可以准确知道SQL执行的代价,并提供多个方面的调整建议,来进行SQL代码的优化分析。

二、 生成AWR报告

以下,本文将针对oracle10g后提供的常用性能分析报告AWR,依此来描述和分析数据库的性能点和优化建议。

AWR由ORACLE自动产生,默认30分钟采集一次,保留5天的记录。但是也可以通过DBMS_WORKLOAD_REPOSITORY包来手工创建、删除和修改。使用脚本awrrpt.sql或awrrpti.sql来查看AWR报告,这两个脚本都在目录$ORACLE_HOME/rdbms/admin中,报告可以保存为文本文件或HTML文件。

生成AWR报告的步骤如下:

sqlplus sys/sys@127.0.0.1/scmis as sysdba

SQL> @c:/oracle/product/10.2.4/db_1/RDBMS/ADMIN/awrrpt.sql 输入 report_type 的值:html (注:确定报告的格式) 输入 num_days 的值:1 (注:选择快照的天数) 输入 begin_snap 的值:425

(注:起始快照)

输入 end_snap 的值:427 (注:结束快照)

输入 report_name 的值:d:\\scmis-awr-2011-10-29.html (注:报告生成的名称和位置)

三、 AWR报告分析

AWR报告头记录了数据库名称和起始快照时间,报告头中主要分析Elapsed(总时间)和DB Time(DB消耗的时间,不包括后台进行的消耗时间),如果DB Time/Elapsed比值较大,说明数据库系统压力较大,例如下图中系统包括16CPU(2*8核),每个cpu耗时26.7min,负载为26.7/60.03=44.5%,说明数据库服务器存在较大的负荷。

即:427.44/60.3*16*100% = 44.5%

1、 sessions

断数据库的类型可以做参考

2、 Cursors/Session,平均每个会话卡开的游标数。 3、 DB Time

4、 这个数值比较重要,它表示用户操作花费的时间,包括cpu和等待事件。有时候DB Time会比Elapsed

表示采集是实例连接的会话数,这个数可以让我们了解数据库并发用户的大概情况。如果是新接手的数据库,对判

时间要长。因为AWR是一个数据的合集,比如说1分钟内一个用户等待10秒钟,那么10个用户是300秒(5分钟);cpu的时间也是一样一分钟之内,一个cpu处理30秒,那么4个cpu就是1.2分钟,8个就是2.4分钟,这些都以累计的方式记录在awr报告当中的。

AWR报告总览包括了五个部分:缓存尺寸(Cache Sizes)、负载性能(Load Profile)、数据库效率(Instance Efficiency Percentages)、共享池统计(Shared Pool Statistics)、TOP5事件(Top 5 Timed Events)。这五个部分也就是整个报告核心,记录了数据库系统的关键性能参数和状况。

1) 缓存尺寸(Cache Sizes)

主要记录总的缓存大小Buffer Cache和SGA缓存尺寸Shared Pool Size,SGA是ORACLE中非常重要的内存共享区,对系统内的所有进程都是共享的。当多个用户同时连接到一个例程时,所有的用户进程、服务进程都可以共享使用这个SGA区。Shared pool可以分为库缓存(library cache)和数据字典缓存(dictionary cache)。Library cache存放了最近执行的SQL语句、存储过程、函数、解析树以及执行计划等。而dictionary cache则存放了在执行SQL语句过程中,所参照的数据字典的信息,包括SQL语句所涉及的表名、表的列、权限信息等。

2) 负载性能(Load Profile)

这个部分记录了数据库负载情况,绝对值的分析意义不大,需要与之前的基线数据比较才具有更多的意义,单个的报告数据只说明应用的负载情况,绝大多数据并没有一个所谓“正确”的值。其中重要的几个对于Logons大于每秒1~2个,表明可能有争用问题;对于Hard parses大于每秒100,parses大于每秒300,表明硬解析太多,SQL重用率不高,需要解决SQL代码变量绑定问题,并调整共享池参数、调整cursor_sharing参数;对于Sorts大于每秒100,表明排序过多,需要减少SQL代码中排序操作,或调整排序空间。

Logons: Logons show how many users are logged onto the database per second

这个表里应该注重:

1)logical reads和physical reads,同时也可以得到平均每个逻辑读导致多少物理读,即19.1/37410.4=0.05%。平均每个事务产生了9040.68个逻辑读,这个数字应该越小越好。

2)parses 和hard parses:从表中可以看到cpu平均每秒进行了81.24个解析(超过100个应该注意),每秒进行5.39(超过10个应该注意)次硬解析,即cpu每秒要处理5.39个全新的sql。

3) 数据库效率(Instance Efficiency Percentages)

记录了Oracle关键指标的内存命中率及数据库实例其它操作的效率,这个部分反应了数据库中最重要指标的命中率。

? 缓冲区未等待率(buffer nowait %):指在缓冲区中获取buffer的未等待比率。

? 该指标的值应接近100%,如果该值较低,则可能要增大buffer cache,,不应该低

于99%。

? redo缓冲区未等待率(redo nowait %):指在redo缓冲区获取buffer的未等待比率。

? 该指标的值应接近100%,如果该值较低,则有2种可能的情况:

? 1)online redo log没有足够的空间; ? 2)log切换速度较慢。

? 缓冲区命中率(buffer hit %):指数据块在数据缓冲区中的命中率。

? 该指标的值通常应在90%以上(不应该低于99%),否则,需要调整。如果持续小

于90%,可能要加大db_cache_size。但有时,缓存命中率低并不意味着cache设置小了,可能是潜在的全表扫描降低了缓存命中率。

? 内存排序率(in-memory sort %):指排序操作在内存中进行的比率。该指标的值应接近

100%,如果指标的值较低,则表示出现了大量排序时的磁盘i/o操作,可考虑加大sort_area_size参数的值。

? 共享区命中率(library hit %):该指标主要代表sql在共享区的命中率。该指标的值通常

应在95%以上,否则需要考虑加大共享池(修改shared_pool_size参数值),绑定变量,修改cursor_sharing等参数。

? 软解析的百分比(soft parse %):该指标是指oracle对sql的解析过程中,软解析所占的

百分比。

? 该指标的值通常应在95%以上,如果低于80%,那么就可能sql基本没被重用,sql

没有绑定变量,需要考虑绑定变量。

? 闩锁命中率(latch hit %):指获得latch的次数与请求latch的次数的比率。

? 该指标的值应接近100%,如果低于99%,需要分析闩锁竞争,明确是应用锁、数

据字典锁、内存控制锁的哪一种。通过进一步分析Latch Statistics章节或动态性能视图v$session_wait,v$latch,v$latch_children。

? sql语句执行与解析的比率(execute to parse %):指sql语句执行与解析的比率。该指

标的值应尽可能到高,如果过低,可以考虑设置session_cached_cursors参数。 ? % Non-Parse CPU: 说明花费在十几工作的时间和花费在解析上的时间的对比 ? execute to parse%,说明sql语句执行与解析的比率

4) 共享池统计(Shared Pool Statistics)

记录了在采集点时刻,共享池(share pool)内存被使用的比例。这个指标的值应保持在75%~90%,如果这个值太低,就浪费内存,如果太高,会使共享池外部的组件老化,如果sql语句被再次执行,则就会发生硬分析。其中执行次数大于1的sql比率(SQL with executions>1),如果此值太小,说明需要在应用中更多使用绑定变量,避免过多SQL解析。

? Memory Usage,说明在shared pool中,被使用的部分占shared pool总尺寸的百分

比。这个值应保持适中,(如85%),如果太高,则会引起shared pool中的对象被刷出内存,从而导致sql语句的硬解析增加,太低则浪费内存;

? SQL with executions>1,执行次数大于1次的sql占总sql数的百分比,越大越好; ? Memory for SQL w/exec>1,在shared pool中执行次数大于1次的sql语句所消耗

的内存占shared pool的百分比

5) TOP5事件(Top 5 Timed Events)

这个部分也是AWR报告中非常重要的部分,从这里可以看出等待时间在前五位的是什么事件,基本上就可以判断出性能瓶颈在什么地方。通常,在没有问题的数据库中,CPU time总是列在第一个,其他几类重要影响性能的事件分析如下。

? 缓冲区忙(buffer busy):当一个会话想要访问缓存中的某个块,而这个块正在被其它会

话使用时,将会产生该等待事件。这时候,其它会话可能正在从数据文件向缓存中的这个块写入信息,或正在对这个块进行修改。出现这个等待事件的频度不应大于1%。如果这个等待事件比较显著,则需要根据等待事件发生在缓存中的哪一块(如字段头部、回退段头部块、回退段非头部块、数据块、索引块等),采取相应的优化方法。

? 文件分散读取(db file scattered read):该等待事件通常与全表扫描有关。因为全表扫描

是被放入内存中进行的进行的,通常情况下它不可能被放入连续的缓冲区中,所以就散布在缓冲区的缓存中。如果这个等待事件比较显著,可能说明对于某些全表扫描的表,没有创建索引或没有创建合适的索引。尽管在特定条件下执行全表扫描可能比索引扫描更有效,但如果出现这种等待时,最好检查一下这些全表扫描是否必要。

? 文件顺序读取(db file sequential read):该等待事件通常与单个数据块相关的读取操作

有关。如果这个等待事件比较显著,可能表示在多表连接中,表的连接顺序存在问题,或者可能不合适地使用了索引。对于大量事务处理、调整良好的系统,这一数值大多是很正常的,但在某些情况下,它可能暗示着系统中存在问题。应检查索引扫描,以保证每个扫描都是必要的,并检查多表连接的连接顺序。另外db_cache_size?也是这些等待出现频率的决定因素。

? 队列(enqueue):队列是一种保护共享资源的锁定机制。该锁定机制保护共享资源,如

记录中的数据,以避免两个人在同一时间更新同一数据。如果enqueue等待事件比较显著,则需要根据enqueue等待类型,采取相应的优化方法。

? 闩锁释放(latch free):latch是一种低级排队机制(它们被准确地称为相互排斥机制),用于

保护系统全局区域(sga)中共享内存结构。该等待事件意味着进程正在等待其他进程已持

有的latch。对于常见的latch等待通常的解决方法:1)share pool latch:在oltp应用中应该更多的使用绑定变量以减少该latch的等待。2)library cache latch:同样的需要通过优化sql语句使用绑定变量减少该latch的等待。

? 日志文件同步(log file sync):这个等待事件是指当一个会话完成一个事务(提交或者回

滚数据)时,必须等待lgwr进程将会话的redo信息从日志缓冲区写到日志文件后,才能继续执行下去。这个等待事件的时间过长,可能是因为commit太频繁或者lgwr进程一次写日志的时间太长(可能是因为一次log io size太大),可调整_log_io_size。 ? wait for a undo record:数据库恢复 ?

read by other session ? READ BY OTHERS SESSIONS 的根本原因就是因为你某条SQL做了大量block的扫描, 我猜

想那条SQL至少要50万个逻辑读. 除了解决SQL问题,基本没有别的办法

6) Time Model Statistics Statistic Name sql execute elapsed time DB CPU parse time elapsed Time (s) % of DB Time 85,698.49 26,832.02 369.05 99.38 31.12 0.43

hard parse elapsed time failed parse elapsed time sequence load elapsed time PL/SQL execution elapsed time hard parse (sharing criteria) elapsed time PL/SQL compilation elapsed time connection management call elapsed time hard parse (bind mismatch) elapsed time repeated bind elapsed time DB time background elapsed time background cpu time 324.19 109.55 62.49 17.78 7.54 1.42 0.49 0.13 0.12 86,229.43 1,211.05 46.42 0.38 0.13 0.07 0.02 0.01 0.00 0.00 0.00 0.00 Sql execute elapsed time 数据库执行SQL总时间 parse time elapsed 解释SQL总时间

hard parse elapsed time 硬解释SQL的总时间 PL/SQL execution elapsed time pl/sql执行时间 DB CPU 用户占用CPU的总时间

failed parse elapsed time 遇到SQL解释时间

7) SQL统计(SQL Statistics)

AWR报告中还有一块对性能影响最大的指标,TOP SQL统计。本节按各种资源分别列出对资源消耗最严重的SQL语句,并显示它们所占统计期内全部资源的比例,提供给我们调优依据。

该SQL的执行时间总和,需要综合分析CPU时间(CPU Time)和执行次数(Executions)才能得到单个SQL的代价。单次执行开销较大的SQL属于重点优化之列。

? SQL ordered by CPU Time: 记录了执行占CPU时间总和时间最长的SQL,再CPU

消耗较大的系统中,重点优化此类SQL。

? SQL ordered by Elapsed Time: 记录了执行总和时间的SQL,记录的是监控范围内

? SQL ordered by Gets: 记录了执行占总buffer gets(逻辑IO)的SQL,查找总的缓冲

区获取比较高的SQL,并根据平均每次执行缓冲区获取的数量判断优化的余地有多大。优化这些SQL,有助于减少CPU开销以及数据缓冲池相关的闩锁竞争。

? SQL ordered by Reads:记录了执行占总磁盘物理读(物理IO)的SQL,查找总的物理

读比较高的SQL,并根据平均每次执行物理读的数量判断优化的余地有多大。优化这些SQL,有助于减少I/O开销和CPU开销。

? SQL ordered by Executions:记录了按照SQL的执行次数排序的SQL,执行次数多

的SQL也是需要重点优化,使sql语句中的子操作执行次数尽量少。

? SQL ordered by Parse Calls:记录了解析次数排序的SQL,避免出现硬解析,采用使

用绑定变量等方式。

? SQL ordered by Sharable Memory:记录了SQL占用library cache的大小的SQL。 ? SQL ordered by Version Count:记录了SQL的打开子游标的SQL。 ? SQL ordered by Cluster Wait Time:记录了集群的等待时间的SQL。

8) IO Stats -->Tablespace IO Stats

Tablespace Reads Av Reads/s Av Rd(ms) Av Blks/Rd Writes Av Writes/s Buffer Waits Av Buf Wt(ms) SYSAUX UNDOTBS SYSTEM USERS TEMP TEST2 9,553 7,879 2,496 364 34 4 0 0 0 0 0 0 4.07 3.21 4.74 3.08 3.24 47.50 1.65 19,729 1.00 1.62 1.57 12.35 1.00 8,252 4,469 4 25 4 0 0 0 0 0 0 0 20 0 0 0 0 0.00 5.50 0.00 0.00 0.00 0.00 ? 1)可以找到具有频繁读写活动的表空间或数据文件,如果临时表空间的写入数量最高,说明排序太多太大; ? 2)从AVG BLKS/RD列可以看出,哪些表空间上经历了最多的全表扫描,如果值大于1,则应该将该值与初始化参数db_file_multiblock_read_count的值进行比较,如果他们越接近,说明在该表空间上进行的大部分是全表扫描;

? 3)检查AV RD(MS),该列表明I/O读的时间,值应该小于20ms,如果过大应该检查是否将读写很频

繁的文件放在了同一个磁盘上

9) Segment Statistics

? 1)Segments by Logical Reads或Segments by Physical Reads 可以找到逻辑读或物理读比较大的对象,

并查找原因,是否可以通过创建新索引、或采用分区表等来降低对象的逻辑读以及物理读; ? 2)Segments by Row Lock Waits ,通过这个报表可以找到获得行级锁最严重的对象,需要跟开发人员

探讨解决方法;

? 3)Segments by ITL Waits ,这个报表可以标明获得ITL等待最严重的对象,如果发现了ITL等待很

严重的对象,则应该将对象的initrans参数设置为并发操作该对象的进程个数;

? 4)Segments by Buffer Busy Waits,获得buffer busy waits最严重的对象。在同一时刻只有一个进程能

够访问同一个数据块,其它进程必须等待。解决的关键是优化那些扫描了过多数据块的sql语句,减少他们要扫描的数据块。如果已经优化了sql语句,则可以考虑增大pctfree的值,从而减少一个数据块中能够包含的数据行数,从而将对象的数据行分部到更多的数据块里去。

10) Instance Activity Statistics 实例活动统计数据

1) 比较在内存中和磁盘中的排序量,如果磁盘排序太高就需要增加PGA_AGGREGATE_TARGET(或者旧版

本中增大SORT_AREA_SIZE)

2) 如果磁盘的读操作较高,表明可能执行了全表扫描,如果目前存在大量的较大的对较大表的全表扫描,就

应当评估最常用的查询并通过增加索引来提高效率。大量的非一致性读操作意味着使用了过多的索引或者使用了非选择性索引。

3) 如果脏读缓冲区数量高于所请求的空闲缓冲区的数量(超过5%),那么说明DB_CACHE_SIZE太小,或

者没有建立足够多的检查点。如果叶节点的分裂数量很高可以考虑重建已增长或已经碎化的索引。

4) consistent gets:没有使用select for update子句的查询在缓冲中访问的数据块数量,这个数量加上DB BLOCK

GETS统计信息的值就是逻辑读操作总数

5) DB BLOCK GETS:使用了INSERT UPDATE DELETE OR SELECT FOR UPDATE语句在缓存中访问的数

据块数量。

6) PHYSICAL READS:没有从缓存中度取得数据量。可以从磁盘,操作系统缓存或者磁盘缓存中读取,以满

足SELECT,SELECT FOR UPDATE,INSERT,UPDATE,DELETE语句 7) LOGICAL READS=CONSISTENT GETS+DB BLOCK GETS

8) 缓存命中率HIT RATIO=(LOGICAL READS- PHYSICAL READS)/LOGICAL READS *100% 9)

缓存命中率应该高于95%,否则需要增加DB_CACHE_SIZE。

=(CONSISTENT GETS+DB BLOCK GETS- PHYSICAL READS)/(CONSISTENT GETS+DB BLOCK GETS) *100%

值超过0,可以考虑增加DB_WR进程。

10) DIRTY BUFFERS INSPECTED :从LRU列表中清除掉的脏读(经过修改的)数据缓冲区的数量,如果此

11) ENQUEUE TIMEOUTS:请求入列的次数(锁定),以及所请求的特定队列不可用的次数。如果这个统计信

息大于0,就需要调查锁定问题。

12) FREE BUFFER INSPECTED:由于是脏读数据、被固定或者正忙等原因儿跳过的缓冲区数量。如果数量很

大的话就说明缓冲区缓存太小了。

13) PARSE COUNT:一条SQL语句被解析的次数。

字典缓存的命中率,以及是否有表或者索引的范围过大。除非使用了大量PL/SQL,否则在用户调用中,递归调用所占的比例应该低于10%。

15) REDO SIZE:写入日志中,以字节为单位的重做信息的数量。该信息将有助于确定重做日志的大小。

14) RECURSIVE CALLS:数据库中递归调用的数量。如果某个进程中的递归调用数量大于4,就应当检查数据

16) SORTS(DISK):磁盘排序的数量。磁盘排序除以内存排序数量不应该高于5%.否则需要调整

SORT_AREA_SIZE,PGA_AGGREGATE_TARGET的大小

注意:SORT_AREA_SIZE分配的内存是面向每个用户的,PGA_AGGREGATE_TARGET分配的内存是面向所有会话的。

SORTS(MEMORY):在内存中排序的数量。 SORTS(ROWS):参加排序的数据行的数量。

17) TABLE FETCH BY ROWID:通过访问ROWID访问的数据行的数量。该值很高通常意味着就获取数据的操

作而言,应用程序调整的不错。

18) TABLE FETCH CONTINUED ROW:获取的数据行的数量,可以是链化数据行,也可以是迁移的数据行

11) 表空间和文件I/O统计数据

对于带缓存的磁盘I/O时间通常少于1ms.

在init.ora文件中可以设置参数DB_FILE_MULTIBLOCK_READ_COUNT有助于磁盘读取时间,该参数控制在全表扫描时一次I/O中读入的

数据块数量,这将减少扫描一张表所需的I/O数量,从而提高全表扫描的性能。但是,设置该参数的结果是优化器可能会执行更多的

全表扫描,所以需要将OPTIMIZER_INDEX_COST_ADJ设为一个值,例如10,来消除这个问题,并且驱动索引的使用。

数据字典和库缓存的统计数据

如果报表中PCT MISS值很高,你应当提高应用程序中游标的共享程度或者增加共享池的尺寸。

AWR报表和STATSPACK输出结果中首先需要查看的10项内容 1)首要的5个等待时间; 2)负载简档; 3)实力效率和命中率; 4)等待事件; 5)闩锁等待;

6)首要的SQL; 7)实例活动;

8)文件I/O和段统计数据; 9)内存分配; 10)缓冲区等待;

四、 具体案例分析

1) DB Time > 内核数*Elapsed的时间

如果DB Time > 内核数*Elapsed的时间, 说明数据库负载非常严重,可通过TOP EVENT和LOAD PROFILE 等定位瓶颈

本文来源:https://www.bwwdw.com/article/w46f.html

Top