ORACLE性能AWR报告的使用和分析报告.docx
- 文档编号:23826314
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:16
- 大小:240.16KB
ORACLE性能AWR报告的使用和分析报告.docx
《ORACLE性能AWR报告的使用和分析报告.docx》由会员分享,可在线阅读,更多相关《ORACLE性能AWR报告的使用和分析报告.docx(16页珍藏版)》请在冰豆网上搜索。
ORACLE性能AWR报告的使用和分析报告
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是Oracle9i之前使用的一个数据库收集工具,收集了数据库全面信息,包括负载概览、前五个等待事件、高速缓存的大小、共享池中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报告的步骤如下:
sqlplussys/sys127.0.0.1/scmisassysdba
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〔总时间〕和DBTime〔DB消耗的时间,不包括后台进展的消耗时间〕,如果DBTime/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、 DBTime
4、 这个数值比拟重要,它表示用户操作花费的时间,包括cpu和等待事件。
有时候DBTime会比Elapsed时间要长。
因为AWR是一个数据的合集,比如说1分钟一个用户等待10秒钟,那么10个用户是300秒〔5分钟〕;cpu的时间也是一样一分钟之,一个cpu处理30秒,那么4个cpu就是1.2分钟,8个就是2.4分钟,这些都以累计的方式记录在awr报告当中的。
AWR报告总览包括了五个局部:
缓存尺寸〔CacheSizes〕、负载性能〔LoadProfile〕、数据库效率〔InstanceEfficiencyPercentages〕、共享池统计〔SharedPoolStatistics〕、TOP5事件〔Top5TimedEvents〕。
这五个局部也就是整个报告核心,记录了数据库系统的关键性能参数和状况。
1)缓存尺寸〔CacheSizes〕
主要记录总的缓存大小BufferCache和SGA缓存尺寸SharedPoolSize,SGA是ORACLE中非常重要的存共享区,对系统的所有进程都是共享的。
当多个用户同时连接到一个例程时,所有的用户进程、服务进程都可以共享使用这个SGA区。
Sharedpool可以分为库缓存〔librarycache〕和数据字典缓存〔dictionarycache〕。
Librarycache存放了最近执行的SQL语句、存储过程、函数、解析树以与执行计划等。
而dictionarycache那么存放了在执行SQL语句过程中,所参照的数据字典的信息,包括SQL语句所涉与的表名、表的列、权限信息等。
2)负载性能〔LoadProfile〕
这个局部记录了数据库负载情况,绝对值的分析意义不大,需要与之前的基线数据比拟才具有更多的意义,单个的报告数据只说明应用的负载情况,绝大多数据并没有一个所谓“正确〞的值。
其中重要的几个对于Logons大于每秒1~2个,说明可能有争用问题;对于Hardparses大于每秒100,parses大于每秒300,说明硬解析太多,SQL重用率不高,需要解决SQL代码变量绑定问题,并调整共享池参数、调整cursor_sharing参数;对于Sorts大于每秒100,说明排序过多,需要减少SQL代码中排序操作,或调整排序空间。
Logons:
Logonsshowhowmanyusersareloggedontothedatabasepersecond
这个表里应该注重:
1〕logicalreads和physicalreads,同时也可以得到平均每个逻辑读导致多少物理读,即19.1/37410.4=0.05%。
平均每个事务产生了9040.68个逻辑读,这个数字应该越小越好。
2〕parses 和hardparses:
从表中可以看到cpu平均每秒进展了81.24个解析〔超过100个应该注意〕,每秒进展5.39〔超过10个应该注意〕次硬解析,即cpu每秒要处理5.39个全新的sql。
3)数据库效率〔InstanceEfficiencyPercentages〕
记录了Oracle关键指标的存命中率与数据库实例其它操作的效率,这个局部反响了数据库中最重要指标的命中率。
●缓冲区未等待率(buffernowait%):
指在缓冲区中获取buffer的未等待比率。
⏹该指标的值应接近100%,如果该值较低,那么可能要增大buffercache,,不应该低于99%。
●redo缓冲区未等待率(redonowait%):
指在redo缓冲区获取buffer的未等待比率。
◆该指标的值应接近100%,如果该值较低,那么有2种可能的情况:
●1〕onlineredolog没有足够的空间;
●2〕log切换速度较慢。
●缓冲区命中率(bufferhit%):
指数据块在数据缓冲区中的命中率。
⏹该指标的值通常应在90%以上〔不应该低于99%〕,否那么,需要调整。
如果持续小于90%,可能要加大db_cache_size。
但有时,缓存命中率低并不意味着cache设置小了,可能是潜在的全表扫描降低了缓存命中率。
●存排序率(in-memorysort%):
指排序操作在存中进展的比率。
该指标的值应接近100%,如果指标的值较低,那么表示出现了大量排序时的磁盘i/o操作,可考虑加大sort_area_size参数的值。
●共享区命中率(libraryhit%):
该指标主要代表sql在共享区的命中率。
该指标的值通常应在95%以上,否那么需要考虑加大共享池〔修改shared_pool_size参数值〕,绑定变量,修改cursor_sharing等参数。
●软解析的百分比(softparse%):
该指标是指oracle对sql的解析过程中,软解析所占的百分比。
⏹该指标的值通常应在95%以上,如果低于80%,那么就可能sql根本没被重用,sql没有绑定变量,需要考虑绑定变量。
●闩锁命中率(latchhit%):
指获得latch的次数与请求latch的次数的比率。
⏹该指标的值应接近100%,如果低于99%,需要分析闩锁竞争,明确是应用锁、数据字典锁、存控制锁的哪一种。
通过进一步分析LatchStatistics章节或动态性能视图v$session_wait,v$latch,v$latch_children。
●sql语句执行与解析的比率(executetoparse%):
指sql语句执行与解析的比率。
该指标的值应尽可能到高,如果过低,可以考虑设置session_cached_cursors参数。
●%Non-ParseCPU:
说明花费在十几工作的时间和花费在解析上的时间的比照
●executetoparse%,说明sql语句执行与解析的比率
4)共享池统计〔SharedPoolStatistics〕
记录了在采集点时刻,共享池〔sharepool〕存被使用的比例。
这个指标的值应保持在75%~90%,如果这个值太低,就浪费存,如果太高,会使共享池外部的组件老化,如果sql语句被再次执行,那么就会发生硬分析。
其中执行次数大于1的sql比率〔SQLwithexecutions>1〕,如果此值太小,说明需要在应用中更多使用绑定变量,防止过多SQL解析。
●MemoryUsage,说明在sharedpool中,被使用的局部占sharedpool总尺寸的百分比。
这个值应保持适中,(如85%〕,如果太高,那么会引起sharedpool中的对象被刷出存,从而导致sql语句的硬解析增加,太低那么浪费存;
●SQLwithexecutions>1,执行次数大于1次的sql占总sql数的百分比,越大越好;
●MemoryforSQLw/exec>1,在sharedpool中执行次数大于1次的sql语句所消耗的存占sharedpool的百分比
5)TOP5事件〔Top5TimedEvents〕
这个局部也是AWR报告中非常重要的局部,从这里可以看出等待时间在前五位的是什么事件,根本上就可以判断出性能瓶颈在什么地方。
通常,在没有问题的数据库中,CPUtime总是列在第一个,其他几类重要影响性能的事件分析如下。
●缓冲区忙(bufferbusy):
当一个会话想要访问缓存中的某个块,而这个块正在被其它会话使用时,将会产生该等待事件。
这时候,其它会话可能正在从数据文件向缓存中的这个块写入信息,或正在对这个块进展修改。
出现这个等待事件的频度不应大于1%。
如果这个等待事件比拟显著,那么需要根据等待事件发生在缓存中的哪一块〔如字段头部、回退段头部块、回退段非头部块、数据块、索引块等〕,采取相应的优化方法。
●文件分散读取(dbfilescatteredread):
该等待事件通常与全表扫描有关。
因为全表扫描是被放入存中进展的进展的,通常情况下它不可能被放入连续的缓冲区中,所以就散布在缓冲区的缓存中。
如果这个等待事件比拟显著,可能说明对于某些全表扫描的表,没有创建索引或没有创建适宜的索引。
尽管在特定条件下执行全表扫描可能比索引扫描更有效,但如果出现这种等待时,最好检查一下这些全表扫描是否必要。
●文件顺序读取(dbfilesequentialread):
该等待事件通常与单个数据块相关的读取操作有关。
如果这个等待事件比拟显著,可能表示在多表连接中,表的连接顺序存在问题,或者可能不适宜地使用了索引。
对于大量事务处理、调整良好的系统,这一数值大多是很正常的,但在某些情况下,它可能暗示着系统中存在问题。
应检查索引扫描,以保证每个扫描都是必要的,并检查多表连接的连接顺序。
另外db_cache_size?
也是这些等待出现频率的决定因素。
●队列(enqueue):
队列是一种保护共享资源的锁定机制。
该锁定机制保护共享资源,如记录中的数据,以防止两个人在同一时间更新同一数据。
如果enqueue等待事件比拟显著,那么需要根据enqueue等待类型,采取相应的优化方法。
●闩锁释放(latchfree):
latch是一种低级排队机制(它们被准确地称为相互排斥机制),用于保护系统全局区域(sga)中共享存结构。
该等待事件意味着进程正在等待其他进程已持有的latch。
对于常见的latch等待通常的解决方法:
1〕sharepoollatch:
在oltp应用中应该更多的使用绑定变量以减少该latch的等待。
2〕librarycachelatch:
同样的需要通过优化sql语句使用绑定变量减少该latch的等待。
●日志文件同步(logfilesync):
这个等待事件是指当一个会话完成一个事务〔提交或者回滚数据〕时,必须等待lgwr进程将会话的redo信息从日志缓冲区写到日志文件后,才能继续执行下去。
这个等待事件的时间过长,可能是因为commit太频繁或者lgwr进程一次写日志的时间太长〔可能是因为一次logiosize太大〕,可调整_log_io_size。
●waitforaundorecord:
数据库恢复
●readbyothersession
⏹READBYOTHERS SESSIONS的根本原因就是因为你某条SQL做了大量block的扫描,我猜测那条SQL至少要50万个逻辑读. 除了解决SQL问题,根本没有别的方法
6)TimeModelStatistics
sqlexecuteelapsedtime
85,698.49
99.38
DBCPU
26,832.02
31.12
parsetimeelapsed
369.05
0.43
hardparseelapsedtime
324.19
0.38
failedparseelapsedtime
109.55
0.13
sequenceloadelapsedtime
62.49
0.07
PL/SQLexecutionelapsedtime
17.78
0.02
hardparse(sharingcriteria)elapsedtime
7.54
0.01
PL/SQLcompilationelapsedtime
1.42
0.00
connectionmanagementcallelapsedtime
0.49
0.00
hardparse(bindmismatch)elapsedtime
0.13
0.00
repeatedbindelapsedtime
0.12
0.00
DBtime
86,229.43
backgroundelapsedtime
1,211.05
backgroundcputime
46.42
Sqlexecuteelapsed time 数据库执行SQL总时间parse time elapsed 解释SQL总时间hard parse elapsed time 硬解释SQL的总时间PL/SQL execution elapsed time pl/sql执行时间DBCPU用户占用CPU的总时间failed parse elapsed time 遇到SQL解释时间
7)SQL统计〔SQLStatistics〕
AWR报告中还有一块对性能影响最大的指标,TOPSQL统计。
本节按各种资源分别列出对资源消耗最严重的SQL语句,并显示它们所占统计期全部资源的比例,提供应我们调优依据。
●SQLorderedbyElapsedTime:
记录了执行总和时间的SQL,记录的是监控围该SQL的执行时间总和,需要综合分析CPU时间〔CPUTime〕和执行次数〔Executions〕才能得到单个SQL的代价。
单次执行开销较大的SQL属于重点优化之列。
●SQLorderedbyCPUTime:
记录了执行占CPU时间总和时间最长的SQL,再CPU消耗较大的系统中,重点优化此类SQL。
●SQLorderedbyGets:
记录了执行占总buffergets(逻辑IO)的SQL,查找总的缓冲区获取比拟高的SQL,并根据平均每次执行缓冲区获取的数量判断优化的余地有多大。
优化这些SQL,有助于减少CPU开销以与数据缓冲池相关的闩锁竞争。
●SQLorderedbyReads:
记录了执行占总磁盘物理读(物理IO)的SQL,查找总的物理读比拟高的SQL,并根据平均每次执行物理读的数量判断优化的余地有多大。
优化这些SQL,有助于减少I/O开销和CPU开销。
●SQLorderedbyExecutions:
记录了按照SQL的执行次数排序的SQL,执行次数多的SQL也是需要重点优化,使sql语句中的子操作执行次数尽量少。
●SQLorderedbyParseCalls:
记录了解析次数排序的SQL,防止出现硬解析,采用使用绑定变量等方式。
●SQLorderedbySharableMemory:
记录了SQL占用librarycache的大小的SQL。
●SQLorderedbyVersionCount:
记录了SQL的打开子游标的SQL。
●SQLorderedbyClusterWaitTime:
记录了集群的等待时间的SQL。
8)IOStats-->TablespaceIOStats
AvBlks/Rd
SYSAUX
9,553
0
4.07
1.65
19,729
0
0
0.00
UNDOTBS
7,879
0
3.21
1.00
8,252
0
20
5.50
SYSTEM
2,496
0
4.74
1.62
4,469
0
0
0.00
USERS
364
0
3.08
1.57
4
0
0
0.00
TEMP
34
0
3.24
12.35
25
0
0
0.00
TEST2
4
0
47.50
1.00
4
0
0
0.00
●1〕可以找到具有频繁读写活动的表空间或数据文件,如果临时表空间的写入数量最高,说明排序太多太大;
●2〕从AVGBLKS/RD列可以看出,哪些表空间上经历了最多的全表扫描,如果值大于1,那么应该将该值与初始化参数db_file_multiblock_read_count的值进展比拟,如果他们越接近,说明在该表空间上进展的大局部是全表扫描;
●3〕检查AVRD(MS),该列说明I/O读的时间,值应该小于20ms,如果过大应该检查是否将读写很频繁的文件放在了同一个磁盘上
9)SegmentStatistics
●1〕SegmentsbyLogicalReads或SegmentsbyPhysicalReads 可以找到逻辑读或物理读比拟大的对象,并查找原因,是否可以通过创建新索引、或采用分区表等来降低对象的逻辑读以与物理读;
●2〕SegmentsbyRowLockWaits ,通过这个报表可以找到获得行级锁最严重的对象,需要跟开发人员探讨解决方法;
●3〕SegmentsbyITLWaits ,这个报表可以标明获得ITL等待最严重的对象,如果发现了ITL等待很严重的对象,那么应该将对象的initrans参数设置为并发操作该对象的进程个数;
●4〕SegmentsbyBufferBusyWaits,获得bufferbusywaits最严重的对象。
在同一时刻只有一个进程能够访问同一个数据块,其它进程必须等待。
解决的关键是优化那些扫描了过多数据块的sql语句,减少他们要扫描的数据块。
如果已经优化了sql语句,那么可以考虑增大pctfree的值,从而减少一个数据块中能够包含的数据行数,从而将对象的数据行分部到更多的数据块里去。
10)InstanceActivityStatistics实例活动统计数据
1)比拟在存中和磁盘中的排序量,如果磁盘排序太高就需要增加PGA_AGGREGATE_TARGET(或者旧版本中增大SORT_AREA_SIZE)
2)如果磁盘的读操作较高,说明可能执行了全表扫描,如果目前存在大量的较大的对较大表的全表扫描,就应当评估最常用的查询并通过增加索引来提高效率。
大量的非一致性读操作意味着使用了过多的索引或者使用了非选择性索引。
3)如果脏读缓冲区数量高于所请求的空闲缓冲区的数量〔超过5%〕,那么说明DB_CACHE_SIZE太小,或者没有建立足够多的检查点。
如果叶节点的分裂数量很高可以考虑重建已增长或已经碎化的索引。
4)consistentgets:
没有使用selectforupdate子句的查询在缓冲中访问的数据块数量,这个数量加上DBBLOCKGETS统计信息的值就是逻辑读操作总数
5)DBBLOCKGETS:
使用了INSERTUPDATEDELETEORSELECTFORUPDATE语句在缓存中访问的数据块数量。
6)PHYSICALREADS:
没有从缓存中度取得数据量。
可以从磁盘,操作系统缓存或者磁盘缓存中读取,以满足SELECT,SELECTFORUPDATE,INSERT,UPDATE,DELETE语句
7)LOGICALREADS=CONSISTENTGETS+DBBLOCKGETS
8)缓存命中率HITRATIO=(LOGICALREADS-PHYSICALREADS)/LOGICALREADS*100%
9) =(CONSISTENTGETS+DBBLOCKGETS-PHYSICALREADS)/(CONSISTENTGETS+DBBLOCKGETS)*100%
缓存命中率应该高于95%,否那么需要增加DB_CACHE_SIZE。
10)DIRTYBUFFERSINSPECTED:
从LRU列表中去除掉的脏读〔经过修改的〕数据缓冲区的数量,如果此值超过0,可以考虑增加DB_WR进程。
11)ENQUEUET
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ORACLE 性能 AWR 报告 使用 分析