查看数据库等待事件:
select *from v$system_eventorderby total_waitsdesc;--db file sequential read,db file scattered read,
select *from v$sys_time_modelorderbyvaluedesc;--DB time,hard parse elapsed time,sql execute elapsed time
但是正确找到了数据库最耗费时间的活动,然后要分清什么是因,什么是果,比如果是——io请求数量。需要找到原因,而不是处理结果扩展存储器。
经验准则
应该优化缓存区高速缓存命中率(buffer cache hit ratio),只在内存中找到sql语句请求的数据块的比率,常见的建议标准为提高buffer cache的大小。
闩锁(latch)命中率
“基于命中率规则”虽然反映了数据库内部的使用效率,但是和数据库应用的性能问题没有关系。
oracle 7.1 提供了等待事件的查询接口,可以查看不同等待事件花费的时间。因此基于等待事件的调优技术变为了主流。
基于等待事件分析法,一味关注响应时间,导致如下不良后果:
指标不治本;倾向于扩展硬件,而不是更划算的应用;只顾眼前,忽略长远及可扩展能力。
数据库的分析根据应用,数据库,操作系统的交互方式分为几个阶段:
(1)应用由sql形式向数据库发出请求,等待返回结果集及返回码;
(2)数据库解析sql。再完成他之前,需要完成很多操作,这些操作需要用到操作系统资源;
(3)最后,数据库需要处理部分数据,数据量视数据库设计(索引)和应用(sql的逻辑)的影响。
在内存中会有数据被访问,称为逻辑IO;执行排序,hash运算也会用到IO;
数据在内存中出现的概率,和数据被访问的频率和内存总量而定;
(4)如果数据块不再内存中,需要从磁盘读取;排序和hash运算太大也会导致物理IO;
根据这些阶段总结的分析方法为:
数据库在某一个层次发生性能问题,可能由上一层引起,也可以通过上一层的优化解决。
因此oracle合理的调优步骤为:
(1)通过调整sql,plsql的逻辑和优化表的物理设计(索引,分区)尽可能减少数据量的请求;
(2)通过减少对锁,闩锁,缓存及其他数据库组件的争用获得最好的并发能力;
(3)前两步规范化逻辑IO的请求,通过优化数据库内存组件来最小化物理IO的请求;
(4)到此为止,物理IO已经被控制在合理的实际的需求之内了。接下来,通过提高IO带宽,均衡分配IO负载来满足上述物理IO请求;
这就是oracle数据库按层级进行优化的方法,进一步归纳总结:
(1)应用层:优化应用的逻辑;
(2)数据库代码层:优化sql的执行计划,管理锁和并发;
(3)内存层:PGA(hash运算和排序使用),高速缓存数据库,其他内存缓存组件;
(4)磁盘层:读写表,索引的数据;读取临时工作区;redo和其他日志IO
第一个目标为最小化应用请求,概况为两个技术手段实现:
(1)优化应用代码;涉及到代码的重写;
(2)修改数据库的物理实现;
根据经验,现在广泛运用的其他技术为:
(1)将应用结构化以避免过多的应用请求;
(2)应用在于oracle进行通信的时候使用最佳实践
(3)优化物理数据库设计;
(4)优化oracle的查询优化器;
(5)优化单条sql语句的性能;
(6)使用并行sql
(7)优化并且使用plsql程序;
由多个会话访问同一个资源就会发生争用,如锁争用,内存缓存区争用;
争用瓶颈,导致IO请求无法通过数据库代码层传递到IO子系统中;
表内行的争用(锁等待)和共享内存的争用(闩锁等待、内存缓存区等待等。)是两种最常用的争用;
锁争用(锁等待)的原因:
(1)块锁:ITL等待,一个数据块的事务达到上限,其他会话需要修改这个数据块,需要等待其他事务释放这个数据块的事务槽才行;
(2)一般大量进程同时更新同一条记录,或者特定锁持有时间过长;不调整业务逻辑的情况下,这种锁几乎无法消除;
(3)数据库对象不再存在报错:
a.会话a读取A表记录,读操作永远不等待锁;
b.会话b进行A表的分区交换,写操作永远不等待读操作;
所以会话a报数据块对象不再存在报错。
(4)所有shared memory都有闩锁(latch或者称互斥锁)来保护,阻止对shared memory的并发访问和修改;如果会话需要访问和修改内存数据,需要先获得闩锁;如果另外一个会话也需要修改和访问同样的数据,就需要取得闩锁(latch),这样就发生等待;
另外buffer cache: 当内存块因为多个请求而冲突不可用,就会发生buffer等待;
分析oracle的IO的产生要么是会话查询为了查询或者变更数据而请求数据;要么是会话必须排序或者hash运算数据;或者必须创建临时段来支持大型表连接或者group by,order by等类似操作;
oracle在SGA存储数据块的副本,如果请求的数据块在sga中,就避免了物理IO;
AWR报告中会给出:Advisory Statistics的建议(Buffer Pool Advisory,PGA Memory Advisory
,Shared Pool Advisory,SGA Target Advisory ),其中SGA Target Advisory会给出sga分配大小的建议;
oracle进行在表连接、排序、分组的时候,对数据进行排序或者hash运算操作,PGA专门供排序和hash运算操作;如果PGA空间不足,会再临时段中读出写入数据,完成排序和hash运算;
oracle 11g已经可以在PGA和SGA之间进行内存的移动了。
因此DBA
(1)需要监控oracle内存的分配情况;
(2)微调oracle中表的连接和排序的参数;
例如,
l 参数名:hash_area_size
类别:排序、散列联接、位图索引
说明:与并行执行操作和 DML 或 DDL语句相关。它以字节为单位, 指定要用于散列联接的最大内存量。。
值范围: 0到根据操作系统而定的值。
默认值:派生:2 * SORT_AREA_SIZE 参数值;
l 参数名:pga_aggregate_target
l 参数名:sort_area_retained_size
说明: 以字节为单位,指定在一个排序运行完毕后保留的用户全局区 (UGA) 内存量的最大值。最后一行从排序空间中被提取后,该内存将被释放回 UGA, 而不是释放给操作系统。
值范围: 从相当于两个数据库块的值到 SORT_AREA_SIZE的值。
默认值: SORT_AREA_SIZE的值
l 参数名:sort_area_size
说明: SORT_AREA_SIZE以字节为单位, 指定排序所使用的最大内存量。排序完成后,各行将返回,并且内存将释放。增大该值可以提高大型排序的效率。如果超过了该内存量,将使用临时磁盘段。
值范围: 相当于 6个数据库块的值 (最小值)到操作系统确定的值 (最大值)。默认值:根据操作系统而定
l 参数名:workarea_size_policy
说明: 指定调整工作区大小的策略。此参数控制优化工作区时所处的模式。
值范围: AUTO, MANUAL。
默认值: 如果设置了 PGA_AGGREGATE_TARGET,则为 AUTO; 否则为 MANUAL。
思路1:保证足够的IO带宽来处理物理IO请求。
原理:足够的磁盘才能保证IO带宽和相应时间,而不是更大的存储空间;一块磁盘最少也能满足100次/秒的随机读写;磁盘的繁忙程度不超过50%-70%是保证硬盘响应速度的关键;
思路2:在配置的磁盘上平均分布负载;操作系统层面,LVM文件系统,logic volumn有两种模式,线性模式和条带模式,条带模式能失效平均负载;从raid的层面,raid 0是条带化最好的方式;raid 10 提供供与RAID 1一样的数据安全保障的同时,也提供了与RAID 0近似的存储性能,但存储成本高;RAID-5卷的设计可是增强数据可用性,而且所需的硬件成本最低,一般情况下对写操作性能的影响也是可接受的,但是对于数据库来讲,raid-5是最差的方式,对写操作的性能影响是不可以接受的,因为对于数据库来讲在物理磁盘中做奇偶校验信息,物理IO开销太大了。
oracle的ASM磁盘组提供一种简单通用的方式为普通磁盘做条带,但是效果一般,但是仍然比完全不做条带效果好;
IO压力过大的特征为,IO请求的响应时间过长,一般磁盘的service time < 10ms,SSD延时较短,NAS的延时有很多网络延时;
Oracle会话一般都会在磁盘的写操作上产生等待,DBWR进程采用异步的方式,然后很多情况下还是赶不上数据库的写进度,当然也需要LGWR进程赶得上。