Oracle彻底优化操作方法3
避免动态空间管理
避免动态扩大段
一旦一个表或回滚段被建立,便在数据库中为其数据分配空间,此空间叫段。在数据操作过程中,其数据可能不断增长,而使其原分配的空间容纳不下。
在这种情况下,Oracle就要为其扩大段空间(这叫动态扩大段),动态的扩大段将降低性能。可使用如下语句来检测是否出现动态扩大段:
SQL>Select name, value from V$sysstat where name=’recursive calls’;
如果检测出有动态扩大段,则应为其分配一个较大的范围,以避免或减少出现段的动态扩大。
避免回滚段中动态空间管理
在动态空间管理时也要尽量避免回滚段的动态管理。回滚段的大小会影响到系统性能,应当使它足够大,以便能容纳下事务的回滚段。
可用set transaction命令来为事务分配一个合适的回滚段,如:
set transaction use rollback segment ***;
可采用以下三种方法来处理在动态空间管理时所出现的回滚段:
(1)对于长查询或长事务应当分配一个较大的回滚段,以提高性能。
(2)在同一个应用中同时运行的多个副本,不能共用同一个回滚段,以免出现回滚段争用。
(3)对于频繁更改,但更改数据量较小的并发联机事务处理,可采用较小的回滚段以加快缓冲区中数据的存取。
优化资源争用
当多个进程要同时使用同一资源时,就会发生资源争用,当出现资源争用时,就会产生等待,因此,应设法避免或减少资源争用的出现。
本文主要讨论回滚段、多线索服务器进程和日志缓冲区的闩锁争用问题。
减少回滚段的争用
要减少回滚段的争用,首先需检查是否出现争用。对含有回滚段块的缓冲区的争用也会影响到对回滚段的争用。
这可以通过查询动态性能表V$WAITSTAT来检测是否存在对回滚段的争用(需有SELECT ANY TABLE持权),例如:
SQL>SELECT class,count
2>FROM V$WAITSTAT
3>WHERE class IN(‘system undo header’,’system undo block’,
4>’undo header’,’undo block’);
其中参数含义如下:
◆ system undo header:对含有SYSTEM回滚段标题块的缓冲区的等待次数。
◆ system undo block:对含有SYSTEM回滚段非标题块的缓冲区的等待次数。
◆ undo header:对含有非SYSTEM回滚段标题块的缓冲区的等待次数。
◆ undo block:对含有非SYSTEM回滚段非标题块的缓冲区的等待次数。
如果任何等待次数大于总请求数的1%,则应创建更多的回滚段来减少竞争,可以周期性地检查这些统计数字,并将它与总的请求数据的次数作比较。
总的请求数据次数可用如下语句求出:
SQL>SELECT SUM(value)
2>FROM V$SYSSTAT
3>WHERE name IN(‘db block gets’,’consistent gets’);
减少回滚段争用的办法是为其建立适当数量的回滚段。表1给出了建立回滚段的参考数。
减少对多线索服务器进程的争用
对多线索服务器进程的争用主要表现在对调度进程和共享服务器进程的争用。
减少调度进程的争用
对该进程的争用主要表现在调度进程占用率高及等待响应时间的增长方面。可通过查询动态性能表V$DISPATCHER(需有SELECT ANY TABLE特权)来检查争用情况,例如:
SQL>SELECT network “protocol”,
2>SUM(busy)/(SUM(busy)+SUM(idle)) “Total Rate”
3>FROM V$DISPATCHER GROUP BY network;
其中V$DISPATCHER表中的idle和busy列的含义如下:
◆ idle:表示1%秒单位时间内调度进程的空闲时间。
◆ busy:表示1%秒单位时间内调度进程的占用时间。
DEC net分发进程接近0.5%时间是忙的,TCP分发进程接近3%时间是忙的。若占用率超过50%,则应该用增加调度进程的网络协议来改善性能。
若要检查等待响应时间的增长情况,可通过查询动态性能表V$QUEUE(需有SELECT ANY TABLE特权)来检查。例如:
SQL>SELECT network “protocol”,
2>DECODEE(SUM(totalq),0,’No Responses’),
3>SUM(wait)/SUM(totalq)||
4>’hundredths of seconds,”Average Wait Time Per Response”
5>FROM V$QUEUE q,V$DISPATCHER d
6>WHEEE q.type=’DISPATCHER’ AND q.paddr=d.paddr
7>GROUP BY network;
其中表V$QUEUE中的wait和totaq列的含义如下:
◆ wait:它表示1%秒单位时间内所有已在队列中等待响应的时间。
◆ totalq:表示在队列中的总的响应次数。
可通过以下办法来增加调度进程:
(1)用SQL * DBA的”Configure Multi-Threaded Dipatchers”对话框。
(2)用具有MTS_DISPATCHER参数的ALTER SYSTEM命令。
调度进程的总数由初始化参数MTS_MAX-DIPATCHER限制,在增加调度进程之前需要增加该参数,缺省值为5,最大值依赖操作系统。
减少共享服务器进程的争用
要减少共享服务器进程的争用,首先需确定是否有争用。请求队列中请求等待时间的增长反映对共享服务器进程的争用。
这可以通过查询动态性能表V$SQUEUE(需有SELECT ANY TABLE特权)来确定是否有争用。查询语句的格式如下:
SQL>SELECT network “protocol”, DECODE(totalq,o,’No Requests’,
2>wait/totalq||,’hundreadths of seconds’,) “Average Wait Time Per Requests”
3>FROM V$QUEUE
4>WHERE typc=’COMMON’;
其中表V$QUEUE中的wait和totalq列的含义如下:
◆ wait:队列中1%秒单位时间内所有请求的等待时间。
◆ totalq:是队列中请求的总数。
用如下的查询可以确定有多少个服务器进程在运行:
SQL>SELECT COUNT(*) “Shared Server Proccess”
2>FROM V$ SHARED_SERVERS
3>WHERE status!=’QUIT’;
增加共享服务器进程是由Oracle自动完成的。所以您不必显式地增加服务器进程。
但是,当服务器进程的数量增加到参数MTS_MAX_SERVER所限制的数量时,如果还需增加,就必须修改MTS_MAX_SERVERS的值。
此参数的缺省值为20,最大值依赖于操作系统。
无论是由Oracle自动增加服务器进程或是显示地增加共享服务器进程都可采用如下办法来改善性能:
(1)设置合适的MTS_MAX_SERVERS参数;
(2)用SQL * DBA的”Configure MuIti-Threaded Servers”对话框;
(3)用具有MTS_SERVERS参数的ALTER SYSTEM命令运行时执行:
alter system.mts_dispatchers
减少日志缓冲区闩锁的争用
减少日志缓冲区空间的争用
日志缓冲区的争用将完全抑制数据库的性能,因此要设法减少它。日志空间请求反映了用户进程等待日志缓冲区空间的次数。
所以可通过查问动态性能表V$SYSSTAT(需有SELECT ANY TABLE特权)来确定是否争用日志缓冲区空间。该查询语句的格式如下:
SQL>SELECT name, value
2>FROM V$SYSSTAT
3>WHERE name=’redo log space requests’;
日志空间的请求值应接近于0,否则需增加初始化参数LOG_BUFFER的值,以增加空间、减少争用。
减少日志缓冲区闩锁的争用
对日志缓冲区的访问由闩锁(latches)调控。闩锁分为日志分配闩锁和日志拷贝闩锁两类。
当多个用户同时频繁地访问日志缓冲区时,就可能引起对日志缓冲区闩锁的争用,从而降低性能。
Oracle将所有闩锁的活动记录在动态性能表V$LATCH中。有SELECT ANY TABLE特权的用户可以查询它,以了解是否有争用发生。查询语句如下:
SQL>SELECT name,gets,misses,iddediate_gets,iddediate_miss
2>FROM V$LATCH l,V$LATCHMANE ln
3>WHERE ln.nome IN(‘redo allocation’,’redo copv’)AND ln.latch #=1.latch #;
其中:
◆ willing_to_wait:对闩锁的请求种类之一。
◆ iddediate:对闩锁的请求种类之二。
◆ gets:表示对闩锁的willing_to_wait请求成功的次数。
◆ misses:表示对闩锁的willing_to_wait请求不成功的次数。
◆ iddediate_gets:表示对每个闩锁立即请求成功的次数。
◆ iddediate_miss:表示对每个闩锁立即请求不成功的次数。
要减少日志分配闩锁的争用就需使单个进程持有闩锁的时间最短,要减少此时间又应减少在日志闩锁上的拷贝,即减少参数LOG_SMALL_ENTRY_MAX_SIZE的值。
要减少日志拷贝闩锁的争用,一是观察其争用情况,增加闩锁,即增加LOG_SIMULTANEOUS_COPIES的值;二是减少持有闩锁的时间,
即在获得日志拷贝闩锁之前,就迫使Oracle用户进程事先建立日志项。事先建立的所有日志项的大小都要小于参数LOG_ENTRY_PREBUILD_THRESHOLD,
要事先建立日志项就要增加参数LOG_ENTRY_PREBUILD_THRESSHOLD的值。
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Oracle彻底优化操作方法3》
本文地址:http://www.xiupu.net/archives-465.html
关注公众号:
微信赞赏
支付宝赞赏