通过紧张的网通、移动性能试Q虽然测试准备和讨论的环节很多,应用服务器测试如果要体现应用服务器的性能Q那么在试环节中,其他环节不能成ؓ(f)瓉Q否则应用服务器的性能很隑ֱ现。但实际在我们的试实践中,无论准备情况Q数据库调优都是永恒的话题,数据库的优劣直接影响整个试的性能表现。本文结合了(jin)一些测试经验和一些资料的整理Q给Z(jin)个h的一些经验,共大家分享,本文重?/span> Unix 环境?/span>
Oracle 数据库服务器是整个系l的核心(j)Q它的性能高低直接影响整个pȝ的性能Qؓ(f)?jin)调?/span> Oracle 数据库服务器的性能Q主要从以下几个斚w考虑Q?/span>
调整操作pȝ以适合 Oracle 数据库服务器q行Q?/span> Oracle 数据库服务器很大E度上依赖于q行服务器的操作pȝQ如果操作系l不能提供最好性能Q那么无论如何调_(d) Oracle 数据库服务器也无法发挥其应有的性能?/span>
?/span> Oracle 数据库服务器规划pȝ资源Q据已有计算机可用资?/span> , 规划分配l?/span> Oracle 服务器资源原则是Q尽可能?/span> Oracle 服务器用资源最大化 , 特别?/span> Client/Server 中尽量让服务器上所有资源都来运?/span> Oracle 服务。调整计机pȝ中的内存配置Q多数操作系l都用虚存来模拟计算Z更大的内存,它实际上是硬盘上的一定的盘I间。当实际的内存空间不能满_用Y件的要求Ӟ操作pȝ将用这部分的磁盘空间对内存中的信息q行面替换Q这引起大量的盘 I/O 操作Q整个服务器的性能下降。ؓ(f)?jin)避免过多地使用虚存Q应加大计算机的内存?/span>
?/span> Oracle 数据库服务器讄操作pȝq程优先U,不要在操作系l中调整 Oracle q程的优先Q因为在 Oracle 数据库系l中Q所有的后台和前台数据库服务器进E执行的是同{重要的工作Q需要同{的优先U。所以在安装Ӟ让所有的数据库服务器q程都用缺省的优先U运行?/span>
调整内存分配Q?/span> Oracle 数据库服务器保留 3 个基本的内存高速缓存,分别对应 3 U不同类型的数据Q库高速缓存,字典高速缓存和~冲区高速缓存。库高速缓存和字典高速缓存一h成共享池Q共享池再加上缓冲区高速缓存便构成?jin)系l全E区 (SGA) ?/span> SGA 是对数据库数据进行快速访问的一个系l全E区Q若 SGA 本n需要频J地q行释放、分配,则不能达到快速访问数据的目的Q因此应?/span> SGA 攑֜d中,不要攑֜虚拟内存中。内存的调整主要是指调整l成 SGA 的内存结构的大小来提高系l性能Q由?/span> Oracle 数据库服务器的内存结构需求与应用密切相关Q所以内存结构的调整应在盘 I/O 调整之前q行?/span>
1 、库~冲区的调整
库缓冲区中包含私用和׃n SQL ?/span> PL/SQL 区,通过比较库缓冲区的命中率军_它的大小。要调整库缓冲区Q必首先了(jin)解该库缓冲区的活动情况,库缓冲区的活动统计信息保留在动态性能?/span> v$librarycache 数据字典中,可通过查询该表来了(jin)解其zd情况Q以军_如何调整?/span>
Select sum(pins),sum(reloads) from v$librarycache;
Pins 列给?/span> SQL 语句Q?/span> PL/SQL 块及(qing)被访问对象定义的L敎ͼ Reloads 列给?/span> SQL ?/span> PL/SQL 块的隐式分析或对象定义重装蝲时在库程序缓冲区中发生的错误。如?/span> sum(pins)/sum(reloads) ?/span> 0 Q则库缓冲区的命中率合适;?/span> sum(pins)/sum(reloads)>1, 则需调整初始化参?/span> shared_pool_size 来重新调整分配给׃n池的内存量?/span>
2 ?/span> 数据字典~冲区的调整
数据字典~冲区包含了(jin)有关数据库的l构、用戗实体信息。数据字典的命中率,对系l性能影响极大。数据字典缓冲区的用情况记录在动态性能?/span> v$librarycache 中,可通过查询该表来了(jin)解其zd情况Q以军_如何调整?/span>
Select sum(gets),sum(getmisses) from v$rowcache;
Gets 列是对相应项hơ数的统计; Getmisses 列是引v~冲区出错的数据的请求次数。对于频J访问的数据字典~冲区, sum(getmisses)/sum(gets)<10% ?/span> 15% 。若大于此百分数Q则应考虑增加数据字典~冲区的定wQ即需调整初始化参?/span> shared_pool_size 来重新调整分配给׃n池的内存量?/span>
3 ?/span> ~冲区高速缓存的调整
用户q程所存取的所有数据都是经q缓冲区高速缓存来存取Q所以该部分的命中率Q对性能臛_重要。缓冲区高速缓存的使用情况记录在动态性能?/span> v$sysstat 中,可通过查询该表来了(jin)解其zd情况Q以军_如何调整?/span>
Select name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads');
dbblock gets ?/span> consistent gets 的值是h数据~冲ZȝL数?/span> physical reads 的值是h数据时引起从盘中L件的ơ数。从~冲区高速缓存中ȝ可能性的高低UCؓ(f)~冲区的命中率,计算公式Q?/span>
Hit Ratio=1-(physical reds/(dbblock gets+consistent gets))
如果 Hit Ratio<60% ?/span> 70% Q则应增?/span> db_block_buffers 的参数倹{?/span> db_block_buffers 可以调整分配l缓冲区高速缓存的内存量,?/span> db_block_buffers 可设|分配缓冲区高速缓存的数据块的个数。缓冲区高速缓存的d节数 =db_block_buffers 的?/span> *db_block_size 的倹{?/span> db_block_size 的DC数据块大小的字节数Q可查询 v$parameter 表:(x)
select name,value from v$parameter where name='db_block_size';
在修改了(jin)上述数据库的初始化参C后,必须先关闭数据库Q在重新启动数据库后才能使新的设|v作用?/span>
很多的时侯,当应用很慢、数据库很慢的时侯,我们到数据库时做几个CZ?/span> Select 也发现同L(fng)问题Ӟ有些时侯我们?x)无从下手,因?f)我们认ؓ(f)数据库的各种命种率都是满?/span> Oracle 文的徏议。实际上如今的优化己l向优化{待 (waits) 转型?jin),实际中性能优化最Ҏ(gu)的出现点也都集中?/span> IO Q这是媄(jing)响性能最主要的方面,ql中的等待去发现 Oracle 库中的不뀁操作系l某些资源利用的不合理是一个比较好的办法。在Ud的测试中Q?/span> Sun 的工E师也推荐这L(fng)做法?/span>
通过操作pȝ的一些工h查系l的状态,比如 CPU 、内存、交换、磁盘的利用率,Ҏ(gu)l验或与pȝ正常时的状态相比对Q有时系l表面上看v来看I闲q也可能不是一个正常的状态,因ؓ(f) cpu 可能正等?/span> IO 的完成。除此之外我们还应观注那些占用系l资?/span> (cpu 、内?/span> ) 的进E?/span>
1 、如何检查操作系l是否存?/span> IO 的问题?使用的工h sar, q是一个比较通用的工兗?/span>
Rp1#sar -u 2 10
x?/span> 2 U检察一ơ,共执?/span> 20 ơ。示例返回:(x)
Linux
10:36:07 AM CPU %user %nice %system %idle
10:36:09 AM all 0.00 0.00 0.13 99.87
10:36:11 AM all 0.00 0.00 0.00 100.00
10:36:13 AM all 0.25 0.00 0.25 99.49
10:36:15 AM all 0.13 0.00 0.13 99.75
10:36:17 AM all 0.00 0.00 0.00 100.00
10:36:17 AM CPU %user %nice %system %idle
10:36:19 AM all 0.00 0.00 0.00 100.00
10:36:21 AM all 0.00 0.00 0.00 100.00
10:36:23 AM all 0.00 0.00 0.00 100.00
10:36:25 AM all 0.00 0.00 0.00 100.00
其中?/span> %usr 指的是用戯E用的 cpu 资源的百分比Q?/span> %sys 指的是系l资源?/span> cpu 资源的百分比Q?/span> %wio 指的是等?/span> io 完成的百分比Q这是值得我们观注的一, %idle 即空闲的癑ֈ比。如?/span> wio 列的值很大,如在 35% 以上Q说明你的系l的 IO 存在瓉Q你?/span> CPU p?jin)很大的旉ȝ?/span> IO 的完成?/span> Idle 很小说明pȝ CPU 很忙?/span>
当你的系l存?/span> IO 的问题,可以从以下几个方面解?/span>
1 、查?/span> Oracle 中不合理?/span> sql 语句Q对其进行优化?/span>
2 、对 Oracle 中访问量频繁的表除合理徏索引外,再就是把q些表分表空间存放以免访问上产生热点Q再有就是对表合理分区?/span>
x一下内存,常用的工具便?/span> vmstat Q对?/span> hp-unix 来说可以?/span> glance,Aix 来说可以?/span> topas, 当你发现 vmstat ?/span> pi 列非Ӟ memory 中的 free 列的值很, glance,topas 中内存的利用率多?/span> 80% Ӟq时说明你的内存斚w应该调节一下了(jin)Q方法大体有以下几项?/span>
1 、划l?/span> Oracle 使用的内存不要超q系l内存的 1/2, 一般保在系l内存的 40% 为益?/span>
为系l增加内?/span>
2 、如果你的连接特别多Q可以?/span> MTS 的方?/span>
3 、打全补丁,防止内存漏洞?/span>
如何扑ֈ点用pȝ资源特别大的 Oracle ?/span> session ?qing)其执行的语句?/span> Hp-unix 可以?/span> glance,top Q?/span> IBM AIX 可以?/span> topas Q此外可以?/span> ps 的命令。通过q些E序我们可以扑ֈ占用pȝ资源特别大的q些q程的进E号Q我们就可以通过以下?/span> sql 语句发现q个 pid 正在执行哪个 sql Q这?/span> sql 最好在 pl/sql developer,toad {Y件中执行 , ?/span> <> 中的 spid 换成你的 spid 可以了(jin)?/span>
SELECT a.username,a.machine,a.program,a.sid,a.serial#,a.status,c.piece,c.sql_text from v$session a,v$process b,v$sqltext c WHERE b.spid='<>' AND b.addr=a.paddr AND a.sql_address=c.address(+)order BY c.piece
我们可以把得到的这?/span> sql 分析一下,看一下它的执行计划是否走索引Q对其优化避免全表扫描,以减?/span> IO {待Q从而加快语句的执行速度?/span>
另一个有用的脚本Q查扑։十条性能差的 sql:
SELECT * FROM (select PARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_text FROM v$sqlarea
order BY disk_reads DESC )where ROWNUM<10 ;
注意Q在做优?/span>
sql
Ӟl常到使用
in
的语句,q时我们一定要?/span>
exists
把它l换掉,因ؓ(f)
Oracle
在处?/span>
In
时是?/span>
Or
的方式做的,即使用?jin)?ch)引也?x)很慢?/span>
(
q个很有用,我在烟草目中,大量?/span>
not in
操作对大数据量的查询是相当的慢,改ؓ(f)
exists
后,性能提高
100
倍左叻I视图中的数量Uؓ(f)百万
)
在性能试中应当指出,׃客户机、网l、服务器q?/span> 3 个相互依存的l成部分都必调整和同步才能产生最佳的性能Q因此还应根据系l的具体情况Q具体分析和调整。本文涉?qing)?/span> Oracle 调优是数据库调优的一部分,希望同事们不断的补充我们的知识库?/span>