oracle性能调优思想与概论

******************************************* ***** 请阅读原文: blog.csdn.net/clark_xu   ***** 欢迎关注微信公众号:clark_blog *******************************************

oracle性能调优:一种系统化方法

                查看数据库等待事件:

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请求数量。需要找到原因,而不是处理结果扩展存储器。

1.1 oracle调优历史:

                经验准则

                应该优化缓存区高速缓存命中率(buffer cache hit ratio,只在内存中找到sql语句请求的数据块的比率,常见的建议标准为提高buffer cache的大小。

                闩锁(latch)命中率

                “基于命中率规则”虽然反映了数据库内部的使用效率,但是和数据库应用的性能问题没有关系。

                oracle 7.1 提供了等待事件的查询接口,可以查看不同等待事件花费的时间。因此基于等待事件的调优技术变为了主流。

1.2 超越表面分析法

                基于等待事件分析法,一味关注响应时间,导致如下不良后果:

                指标不治本;倾向于扩展硬件,而不是更划算的应用;只顾眼前,忽略长远及可扩展能力。

                数据库的分析根据应用,数据库,操作系统的交互方式分为几个阶段:

                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)内存层:PGAhash运算和排序使用),高速缓存数据库,其他内存缓存组件;

4)磁盘层:读写表,索引的数据;读取临时工作区;redo和其他日志IO

1.3 第一阶段,最小化应用负载

第一个目标为最小化应用请求,概况为两个技术手段实现:

                1)优化应用代码;涉及到代码的重写;

                2)修改数据库的物理实现;

根据经验,现在广泛运用的其他技术为:

                1)将应用结构化以避免过多的应用请求;

                2)应用在于oracle进行通信的时候使用最佳实践

                3)优化物理数据库设计;

                4)优化oracle的查询优化器;

                5)优化单条sql语句的性能;

                6)使用并行sql

                7)优化并且使用plsql程序;

1.4 第二阶段,降低争用和瓶颈

                由多个会话访问同一个资源就会发生争用,如锁争用,内存缓存区争用;

                争用瓶颈,导致IO请求无法通过数据库代码层传递到IO子系统中;

                表内行的争用(锁等待)和共享内存的争用(闩锁等待、内存缓存区等待等。)是两种最常用的争用;

                锁争用(锁等待)的原因:

                1)块锁:ITL等待,一个数据块的事务达到上限,其他会话需要修改这个数据块,需要等待其他事务释放这个数据块的事务槽才行;

                2)一般大量进程同时更新同一条记录,或者特定锁持有时间过长;不调整业务逻辑的情况下,这种锁几乎无法消除;

                3)数据库对象不再存在报错:

                                a.会话a读取A表记录,读操作永远不等待锁;

                                b.会话b进行A表的分区交换,写操作永远不等待读操作;

        所以会话a报数据块对象不再存在报错。

 

                4)所有shared memory都有闩锁(latch或者称互斥锁)来保护,阻止对shared memory的并发访问和修改;如果会话需要访问和修改内存数据,需要先获得闩锁;如果另外一个会话也需要修改和访问同样的数据,就需要取得闩锁(latch),这样就发生等待;

                               另外buffer cache: 当内存块因为多个请求而冲突不可用,就会发生buffer等待;

          1.5 第三阶段:降低物理IO

                分析oracleIO的产生要么是会话查询为了查询或者变更数据而请求数据;要么是会话必须排序或者hash运算数据;或者必须创建临时段来支持大型表连接或者group by,order by等类似操作;

                oracleSGA存储数据块的副本,如果请求的数据块在sga中,就避免了物理IO

                AWR报告中会给出:Advisory Statistics的建议(Buffer Pool AdvisoryPGA Memory Advisory

Shared Pool AdvisorySGA Target Advisory ),其中SGA Target Advisory会给出sga分配大小的建议;

                oracle进行在表连接、排序、分组的时候,对数据进行排序或者hash运算操作,PGA专门供排序和hash运算操作;如果PGA空间不足,会再临时段中读出写入数据,完成排序和hash运算;

                oracle 11g已经可以在PGASGA之间进行内存的移动了。

                因此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.6 第四阶段:优化磁盘IO

                   思路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开销太大了。

                oracleASM磁盘组提供一种简单通用的方式为普通磁盘做条带,但是效果一般,但是仍然比完全不做条带效果好;

                IO压力过大的特征为,IO请求的响应时间过长,一般磁盘的service time < 10ms,SSD延时较短,NAS的延时有很多网络延时;

                Oracle会话一般都会在磁盘的写操作上产生等待,DBWR进程采用异步的方式,然后很多情况下还是赶不上数据库的写进度,当然也需要LGWR进程赶得上。

你可能感兴趣的:(oracle性能调优,优化磁盘IO,最小化应用负载,降低争用和瓶颈)