oracle性能优化之awr分析
oracle性能优化之awr分析
作者:bingjava
最近某证券公司系统在业务期间系统运行缓慢,初步排查怀疑是数据库存在性能问题,因此导出了oracle的awr报告进行分析,在此进行记录。
导致系统的性能问题有很多,比如内存、cpu占用率过高,网络延迟、系统存储io瓶颈、还有程序方面的代码逻辑、性能低下的sql语句等等,这里主要从awr的角度说明如何通过awr的报告来定位问题。
一、awr报告分析及问题定位
DB Name |
DB Id |
Instance |
Inst num |
Release |
RAC |
Host |
**DB |
1527139216 |
**DB |
1 |
10.2.0.5.0 |
NO |
p3-**DB |
Snap Id |
Snap Time |
Sessions |
Cursors/Session |
|
Begin Snap: |
16021 |
01-Mar-16 10:00:34 |
213 |
2.4 |
End Snap: |
16022 |
01-Mar-16 11:00:36 |
213 |
2.3 |
Elapsed: |
60.04 (mins) |
|||
DB Time: |
176.32 (mins) |
关键项说明:
DB TIME:代表了此统计期间的数据库负载,是所有前台session花费在database调用上的总和时间(包括CPU时间、IO Time、和其他一系列非空闲等待时间)。如果 DB Time 接近于 Elapsed Time*cpu 数,表明数据库比较忙,cpu 负载也许比较大。这时很有可能是因为资源争用导致等待事件的结果,可以去 top 5 等待事件分析原因。
Operating System Statistics
Statistic |
Total |
|
BUSY_TIME |
1,037,128 |
|
IDLE_TIME |
10,487,927 |
|
IOWAIT_TIME |
19,061 |
|
NICE_TIME |
316 |
|
SYS_TIME |
132,552 |
|
USER_TIME |
882,792 |
|
LOAD |
3 |
|
RSRC_MGR_CPU_WAIT_TIME |
0 |
|
VM_IN_BYTES |
1,274,466,304 |
|
VM_OUT_BYTES |
2,174,697,472 |
|
PHYSICAL_MEMORY_BYTES |
33,712,308,224 |
|
NUM_CPUS |
32 |
|
NUM_CPU_SOCKETS |
2 |
从以上信息可知:
单数据库实例,非集群部署模式;2个物理cpu(NUM_CPU_SOCKETS=2),32个逻辑cpu(NUM_CPUS=32)。
cpu利用率为:DB Time /(Elapsed* NUM_CPUS)=176/(60*32) *100%=9.2%
cpu的负载处于正常水平。
Load Profile
Per Second |
Per Transaction |
|
Redo size: |
89,367.47 |
21,227.40 |
Logical reads: |
105,600.68 |
25,083.26 |
Block changes: |
458.93 |
109.01 |
Physical reads: |
27,716.84 |
6,583.56 |
Physical writes: |
30.80 |
7.32 |
User calls: |
3,675.70 |
873.09 |
Parses: |
324.60 |
77.10 |
Hard parses: |
14.13 |
3.36 |
Sorts: |
44.47 |
10.56 |
Logons: |
1.69 |
0.40 |
Executes: |
340.07 |
80.78 |
Transactions: |
4.21 |
% Blocks changed per Read: |
0.43 |
Recursive Call %: |
16.91 |
Rollback per transaction %: |
0.09 |
Rows per Sort: |
397.30 |
Redosize:每秒产生的日志大小(单位字节),可标志数据变更频率,大的redosize往往对lgwr写日志,和arch归档造成I/O压力,也有可能造成logbuffer堵塞从而产生相关的等待事件。很繁忙的系统中日志生成量可能达到几百k,甚至几M。在Top 5 Timed Events中未发现log方面的等待事件,说明redo生成的频率属于正常范围。
Logical reads: 从内存中读取数据的次数(次数*块数),每秒钟逻辑读数据量:105,600.68*8k=825m
Physical reads:当从内存中未都到数据时则从硬盘上读取数据,每秒物理读数据量:27,716.84 *8k=216m
Physical reads / Logical reads=27,716.84/105,600.68=26%,有26%的逻辑读导致了物理io。因此此处的物理io可能是系统的性能瓶颈(具体需在后面的 top 5中进行分析)。
Instance Efficiency Percentages (Target 100%)
Buffer Nowait %: |
98.73 |
Redo NoWait %: |
100.00 |
Buffer Hit %: |
73.77 |
In-memory Sort %: |
100.00 |
Library Hit %: |
89.85 |
Soft Parse %: |
95.65 |
Execute to Parse %: |
4.55 |
Latch Hit %: |
96.92 |
Parse CPU to Parse Elapsd %: |
95.60 |
% Non-Parse CPU: |
96.41 |
buffer hit:表示进程从内存中找到数据块的比率,监视这个值是否发生重大变化比这个 值本身更重要。对于一般的 OLTP 系统,通常应在 95%以上。否则应考虑加大 db_cache_size, 但是大量的非选择的索引也会造成该值很高(大量的 db file sequential read)。
Latch Hit:Latch是一种保护内存结构的锁,可以认为是SERVER进程获取访问内存数据结构的许可。要确保Latch Hit>99%,否则意味着Shared Pool latch争用,可能由于未共享的SQL,或者Library Cache太小,可使用绑定变更或调大Shared Pool解决。
Execute to Parse:是语句执行与分析的比例,如果要SQL重用率高,则这个比例会很高。该值越高表示一次解析后被重复执行的次数越多。
Parse CPU to Parse Elapsd:该指标反映了快照内解析CPU时间和总的解析时间的比值(Parse CPU Time/ Parse Elapsed Time); 若该指标水平很低,那么说明在整个解析过程中 实际在CPU上运算的时间很短,而主要的解析时间都耗费在各种其他非空闲的等待事件上了,此值越高越好。
Shared Pool Statistics
Begin |
End |
|
Memory Usage %: |
56.42 |
55.58 |
% SQL with executions>1: |
54.12 |
49.23 |
% Memory for SQL w/exec>1: |
49.88 |
48.29 |
SQL with executions
:代表了sql重复执行的比例,本报告中是54%,是比较低的,说明存在sql硬编码的情况,同时上面的Execute to Parse也只有4.55%,也说明了sql解析的重用率低。
内存利用率为55%左右,属于正常情况。
Top 5 Timed Events
业务11:00-12:00期间:
Event |
Waits |
Time(s) |
Avg Wait(ms) |
% Total Call Time |
Wait Class |
CPU time |
10,028 |
94.8 |
|||
db file scattered read |
6,943,920 |
644 |
0 |
6.1 |
User I/O |
read by other session |
4,837,558 |
578 |
0 |
5.5 |
User I/O |
CSS initialization |
13 |
65 |
4,967 |
.6 |
Other |
db file sequential read |
512,027 |
58 |
0 |
.6 |
User I/O |
业务15:00-16:00期间
Event |
Waits |
Time(s) |
Avg Wait(ms) |
% Total Call Time |
Wait Class |
||
CPU time |
2,569 |
95.8 |
|||||
SQL*Net more data to client |
1,150,806 |
233 |
0 |
8.7 |
Network |
||
db file scattered read |
1,381,500 |
136 |
0 |
5.1 |
User I/O |
||
CSS initialization |
13 |
63 |
4,878 |
2.4 |
Other |
||
db file sequential read |
42,488 |
30 |
1 |
1.1 |
User I/O |
db file scattered read:
表明Oracle内核请求从磁盘读取多个数据块到buffer cache中,
这种情况通常显示与全表扫描相关的等待。当数据库进行全表扫时,基于性能的考虑, 数据会分散读入Buffer Cache。如果这个等待事件比较显著,可能说明对于某些全表扫描的表,没有创建索引或者没有创建合适的索引。
read by other session:
Oracle 操作的最小单位是块(Block),当对数据块做修改时,其他的会话将被阻止对这个数据块上的数据做修改,但是可以以一致性的方式读取这个数据块(from undo)。当前的用户修改完这个数据块后,将会立即释放掉加在这个数据块上的排他锁,这样另一个会话就可以继续修改它,这种加锁的机制叫Latch。当一个会话将数据块都到内存中时,其它的会话同时也请求了这个数据块,就导致被等待的会话出现read by other session。而当前会话一般是db file scattered read或db file sequential read。
从本次awr报告中都发现,db file scattered read、db file sequential read、read by other session这几个事件的等待次数很高,因此可以判断当前业务场景存在热点块竞争问题。
SQL*Net more data to client:
当服务器端有太多的数据需要发给客户端时,可能会产生此等待事件,也可能由于网络问题导致服务器无法及时地将信息或者处理结果发送给客户端, 同样会产生这个等待。在15:00--16:00业务期间此等待事件相对较高,从SQL*Net看并不像应用程序(应用程序是JDBC Thin Client),可能是第三方的oracle监控程序导致的。
File IO Stats
Tablespace |
Filename |
Reads |
Av Reads/s |
Av Rd(ms) |
Av Blks/Rd |
Writes |
Av Writes/s |
Buffer Waits |
Av Buf Wt(ms) |
||||
JSZ35_TBS |
*tbs01.dbf |
2,635,786 |
732 |
0.10 |
14.88 |
4,032 |
1 |
2,016,907 |
0.12 |
||||
JSZ35_TBS |
*tbs02.dbf |
2,730,384 |
758 |
0.09 |
12.89 |
10,420 |
3 |
1,679,836 |
0.12 |
||||
JSZ35_TBS |
*tbs03.dbf |
2,084,937 |
579 |
0.08 |
12.19 |
9,183 |
3 |
1,141,265 |
0.13 |
以上数据文件,平均每秒被读700多次,平均每秒读取的数据块为14块左右。
Tablespace IO Stats
Tablespace |
Reads |
Av Reads/s |
Av Rd(ms) |
Av Blks/Rd |
Writes |
Av Writes/s |
Buffer Waits |
Av Buf Wt(ms) |
||||
JSZ35_TBS |
1,420,317 |
394 |
0.11 |
14.73 |
9,502 |
3 |
113 |
2.30 |
Segments by Buffer Busy Waits
Owner |
Tablespace Name |
Object Name |
Subobject Name |
Obj. Type |
Buffer Busy Waits |
% of Capture |
|||
JSZ35 |
JSZ35_TBS |
TF_SUBJECTPRICE_TMP |
TABLE |
30 |
32.26 |
||||
JSZ35 |
JSZ35_TBS |
IND_T_*LOG |
INDEX |
21 |
22.58 |
||||
JSZ35 |
JSZ35_TBS |
PK_T_**_TMP |
INDEX |
15 |
16.13 |
||||
JSZ35 |
JSZ35_TBS |
T_***HER |
CHER_P2016 |
TABLE PARTITION |
9 |
9.68 |
|||
JSZ35 |
JSZ35_TBS |
IND_T_***HER |
INDEX |
7 |
其它业务时间段:
Owner |
Tablespace Name |
Object Name |
Subobject Name |
Obj. Type |
Buffer Busy Waits |
% of Capture |
|||
JSZ35 |
JSZ35_TBS |
IND_T_*LOG |
INDEX |
60 |
68.18 |
||||
JSZ35 |
JSZ35_TBS |
IND_T_***SED |
INDEX |
20 |
22.73 |
JSZ35 |
JSZ35_TBS |
TF_SUBJECTPRICE_TMP |
TABLE |
18 |
17.65 |
|||
JSZ35 |
JSZ35_TBS |
IND_T_***HER |
INDEX |
7 |
6.86 |
Segments by Physical Reads
Owner |
Tablespace Name |
Object Name |
Subobject Name |
Obj. Type |
Physical Reads |
%Total |
|||
JSZ35 |
JSZ35_TBS |
T_***NCE |
ANCE_P2015 |
TABLE PARTITION |
81,573,441 |
81.70 |
|||
JSZ35 |
JSZ35_TBS |
T_***NCE |
ANCE_P2016 |
TABLE PARTITION |
12,884,029 |
12.90 |
|||
JSZ35 |
JSZ35_TBS |
T_***CE |
RICE_P2016 |
TABLE PARTITION |
3,471,341 |
3.48 |
热点数据块主要是T_***NCE、T_***CE引起。
数据块热点问题io等待的主要对象为:
T_***LOG、TF_SUBJECTPRICE_TMP、TS_PROCESSED、TF_SUBJECTPRICE_TMP、T_***NCE、T_***CE
可结合SQL ordered by CPU Time(最耗时的sql)、SQL ordered by Gets(逻辑读最多的sql)、SQL ordered by Reads(物理读最多的sql)来定位具体的sql语句。
二、问题总结及解决方式
本报告期,系统的cpu、内存表现正常,造成系统性能问题的主要原因为物理读过多,产生io等待;同时由于相关业务表存在频繁的并发访问现象(逻辑读较多)且性能较差而导致了数据块竞争问题。逻辑读是消耗cpu的,而物理读是消耗io的,这也说明了系统的大部分时间都消耗在io等待上,所以cpu相对空闲。
优化方案主要包括应用层的优化和oracle数据库的优化:
一、应用层的优化目标主要在于降低对数据库的访问频率、合理有效使用索引(合理有效使用索引,需通过对sql语句的执行计划进行分析和调优):
- T_***LOG可能存在较频繁的插入数据操作,可采用以下方式减少对数据库的提交操作:
将此表的单条insert的操作改为批量入库提交的方式(比例100条记录入库一次)。
- T_***_TMP可能存在读写混合的场景,需根据业务分析是否有优化的空间。
- T_***NCE、T_***CE、T_A***T,关于此表的相关访问应该是最需要优化的了,需优化的sql语句为(比如索引是否合理):
关键sql语句:SELECT /*+ LEADING ("A3" "A2" "A1") PQ_DISTRIBUTE ("A1", BROADCAST, NONE)USE_NL ("A1") FULL ("A1") PQ_DISTRIBUTE ("A2", BROADCAST, NONE)USE_NL ("A2") FULL ("A2") FULL ("A3") */ "A3"."FSETCODE", "A2"."FDATE", "A1"."FSETNAME", SUM(CASE WHEN "A3"."FACCTATTR" LIKE '??±????%' THEN "A2"."FENDBAL" ELSE 0 END ), SUM(CASE WHEN "A3"."FACCTATTR" LIKE '???±£??%' THEN "A2"."FENDBAL" ELSE 0 END ) FROM "T_A***T" "A3", "T_***NCE" "A2", "T_AS**T" "A1" WHERE "A3"."FACCTDETAIL"=1 AND "A2"."FDATE"=TO_DATE(TO_CHAR(:1), 'yyyy-mm-dd') AND ("A3"."FACCTATTR" LIKE '??±????%' OR "A3"."FACCTATTR" LIKE '???±£??') AND "A3"."FSETCODE"="A1"."FSETCODE" AND "A3"."FSETCODE"="A2"."FSETCODE" AND "A3"."FACCTCODE"="A2"."FACCTCODE" GROUP BY "A3"."FSETCODE", "A2"."FDATE", "A1"."FSETNAME" |
select sum(NVL(fbacccredit, 0)) as fje from(select fsetcode, facctcode, fbacccredit from T_***NCE where fsetcode=:1 and fdate=:2 ) a left join T_A***T b on a.fsetcode = b.fsetcode and a.facctcode = b.facctcode where b.facctattr like :3 and b.facctdetail=1 |
select a.fdate, a.fsetcode, a.fzqdm, a.fhqssj, a.fhqpjj, a.fbjsj, a.fsjsj, a.fzdcj, a.fjyzt, a.fjysc, a.fzqlb, a.fsyqx, a.fdatasource, a.fyqfyfx, a.fgzjgly, a.ftpdate from T_***CE a where fsh = 1 and fdate = to_date('2016-02-29', 'yyyy-MM-dd') and a.fsetcode = 0 union select a.fdate, a.fsetcode, a.fzqdm, a.fhqssj, a.fhqpjj, a.fbjsj, a.fsjsj, a.fzdcj, a.fjyzt, a.fjysc, a.fzqlb, a.fsyqx, a.fdatasource, a.fyqfyfx, a.fgzjgly, a.ftpdate from (select fdate, fsetcode, fzqdm, fhqssj, fhqpjj, fbjsj, fsjsj, fzdcj, fjyzt, fjysc, fzqlb, fsyqx, fdatasource, fyqfyfx, fgzjgly, ftpdate, fsh from T_***CE where fzqlb = 'JJ') a right join (select FDate, FZqdm, fjysc From T_***CE where fsh = 1 and fdate = to_date('2016-02-26', 'yyyy-MM-dd') and fsetcode = 0 and fzqlb = 'JJ') b on b.FDate = a.FDate and a.FZqdm = b.FZqdm and a.fjysc = b.fjysc and a.fsh = 1 where fsetcode = 0 and a.fjysc = 'Y' |
关键的sql语句:其中上面的第一条语句执行情况,SQL ordered by Elapsed Time:
Elapsed Time (s) |
CPU Time (s) |
Executions |
Elap per Exec (s) |
% Total DB Time |
SQL Id |
SQL Module |
SQL Text |
||
3,519 |
3,601 |
0 |
33.26 |
oracle@p3tgbmsdb1 (TNS V1-V3) |
SELECT /*+ LEADING… |
||||
1,305 |
1,086 |
158 |
8.26 |
12.34 |
JDBC Thin Client |
select sum(… |
该语句执行了3600秒(即整个快照期)都还未执行完成,该语句是三张表的关联统计查询,oracle自动对其进行并行查询,可能由于此三张表(T_A***T、T_***NCE、T_AS**T)的数据量较大,尤其是T_A***T的数据量较大时更是影响性能,采用并行查询后反而导致了对io的争用,降低了性能。
4、全表扫描问题
大表在一小时内发生了822次全表扫描,如果表的数据比较大则对性能有很大影响。小表每秒中有28次全表扫描,需重点优化以上3条sql语句。
table scans (direct read) |
0 |
0.00 |
0.00 |
||
table scans (long tables) |
822 |
0.23 |
0.07 |
||
table scans (rowid ranges) |
0 |
0.00 |
0.00 |
||
table scans (short tables) |
102,749 |
28.52 |
8.27 |
||
total number of times SMON posted |
22 |
0.01 |
二、oracle优化
1、合理设置DB_FILE_MULTIBLOCK_READ_COUNT,此参数控制在多数据块读时一次读入数据块的次数。适当增加这个参数大小,能够提高多数据块操作(如全表扫描)的IO效率。
2、可以考虑对以上热点表重建索引、分区表等方式来降低该数据段上的IO负荷,将历史数据进行分离(比如根据业务情况将2015年之前的数据转移到另外的备份库中)。
3、因Buffer Hit只有73%,可根据Buffer Pool Advisory调整buffer pool大小为:16g。
4、将频繁并发访问的表或数据移到另一数据块或者进行更大范围的分布(可以增大pctfree值 ,扩大数据分布,减少竞争)。
5、属于index block的表(如T_***SED、T_***_TMP),应该考虑重建索引、分割索引或使用反向键索引。关于反向键索引需根据sql语句查询特点进行有选择使用(如果在where中对索引列进行了范围搜索,则会导致该索引无效会进行全表扫描,反向键索引只对<>\=有效)。
作者:bingjava
版权声明:本文为博主原创文章,转载请说明出处:http://www.cnblogs.com/bingjava/
*******************************************************************************
oracle性能优化之awr分析的更多相关文章
- 【转载】我眼中的Oracle性能优化
我眼中的Oracle性能优化 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角 ...
- 我眼中的 Oracle 性能优化
恒生技术之眼 作者 林景忠 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角度 ...
- 降低磁盘IO使Oracle性能优化(转)
文章转自:http://blog.chinaunix.net/uid-26813519-id-3207996.html 硬件方面虽然只占Oracle性能优化的一个方面(另一方面是软件),但是仍不可忽视 ...
- Oracle性能优化1-总体思路和误区
最近在看梁敬彬老师关于Oracle性能优化的一些案例,在这里做一些简单的总结 1.COUNT(*)与COUNT(列)哪个更快 drop table t purge; create table t as ...
- mysql性能优化-慢查询分析、优化索引和配置 (慢查询日志,explain,profile)
mysql性能优化-慢查询分析.优化索引和配置 (慢查询日志,explain,profile) 一.优化概述 二.查询与索引优化分析 1性能瓶颈定位 Show命令 慢查询日志 explain分析查询 ...
- Oracle 性能优化的基本方法
Oracle 性能优化的基本方法概述 1)设立合理的性能优化目标. 2)测量并记录当前性能. 3)确定当前Oracle性能瓶颈(Oracle等待什么.哪些SQL语句是该等待事件的成分). 4)把等待事 ...
- Oracle性能优化小结
Oracle性能优化小结 原则一.注意where子句中的连接顺序 Oracle采用自下而上的顺序解析where子句,根据这个原理,表之间的连接必须卸载其他where条件之前,哪些可以滤掉最大数量记录的 ...
- redis性能优化、内存分析及优化
redis性能优化.内存分析及优化 1.优化网络延时 2.警惕执行时间长的操作 3.优化数据结构.使用正确的算法 4.考虑操作系统和硬件是否影响性能 5.考虑持久化带来的开销 5.1 RDB 全量持久 ...
- 浅谈Oracle 性能优化
基于大型Oracle数据库应用开发已有6个年头了,经历了从最初零数据演变到目前上亿级的数据存储.在这个经历中,遇到各种各样的性能问题及各种性能优化. 在这里主要给大家分享一下数据库性能优化的一些方法和 ...
随机推荐
- MVC 纯Table实现树节点效果+授权
这几夜心里颇不平静, 奈何 JS水平有限,前台效果耗时四天,后台传值一天,直至昨夜丑时测试初步完成,其实就是一个给tree来授权,网上开源的插件很多,如treeview.treejs.easyui 等 ...
- 2018-2019-2 20165316 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
2018-2019-2 20165316 <网络对抗技术> Exp6 信息搜集与漏洞扫描 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应 ...
- Navicat Premium 简体中文版 12.0.16 以上版本国外官网下载地址(非国内)
国内Navicat网址是:http://www.navicat.com.cn 国外Navicat网址是:http://www.navicat.com 国外的更新比国内的快,而且同一个版本,国内和国外下 ...
- matlab飞机飞行
function donghua4 %首先建立一个飞机模型 %然后写一个旋转仿射矩阵 %利用仿射变换改变飞机方向 clear;clc;TR=[1 50 41;1 51 50;2 51 1;3 51 2 ...
- linux 安装软件三种方法
引言 在ubuntu当中,安装应用程序我所知道的有三种方法,分别是apt-get,dpkg安装deb和make install安装源码包三种.下面针对每一种方法各举例来说明. apt-get方法 使用 ...
- ps top 命令
pstree :显示进程树 ps: a:查看和终端有关的进程 u:显示进程是哪个用户启动的 x:和终端无关 ps aux |head 进程的分类: 和终端有关 和终端无关 进程状态: D:不可中断睡眠 ...
- 编程类-----matlab基础语法复习(1)
2019年美赛随笔记录: 具体功能:基础语法+基本运算+画图+矩阵+excel读取....... 所遇问题及其解决方案: 1. que:matlab中plot画图无法复制下来图片? ...
- time模块和os模块,json模块
import time # def month(n): # time.local() # struct_time=time.strptime("%Y-%m-1","%Y- ...
- 快速签发 Let's Encrypt 证书指南
本文仅记录给自己的网站添加"小绿锁"的动手操作过程,不涉及 HTTPS 工作原理等内容的讲解,感兴趣的同学可以参考篇尾的文章自行了解. 简单了解下我的实验环境: 云服务器:Cent ...
- Java — CommonUtil
一些Java的公用方法: 1:获取当前时间 2:判断当前时间是否在时间date2之前3:比较时间大小4:获取某个时间的前n个小时5:返回某个字符串时间的Calendar对象6:判断两个时间段是否有重叠 ...