</p> 我们可以通过对v$latch, v$latchholder, v$latchname的查询获得有关latch信息,例如:
! ?+ t+ J' a7 N3 p /* 已知一个latch地址,找到latch名字 */
4 j& X, Z7 R# v. K( h/ A col name for a406 o# M1 s S/ M1 s9 r W
select a.name from v$latchname a, v$latch b
2 {8 l2 l( U) ~) W8 M8 ` where b.addr = '&addr') k! l$ [) l }- X
and b.latch#=a.latch#;$ `. s( s" \+ _
/* 显示系统范围内的latch统计 */% l" U% C0 c, H% m( _* p+ ]. @! f
column name format A32 truncate heading "LATCH NAME" e/ s1 x2 E1 P8 ?! l
column pid heading "HOLDER PID"
" q8 g' Q; e% n% i8 ?( h7 J& m select c.name,a.addr,a.gets,a.misses,a.sleeps,4 |7 p) [1 i8 }8 C" z
a.immediate_gets,a.immediate_misses,b.pid
. |5 E4 a5 x/ q0 @2 f/ Y from v$latch a, v$latchholder b, v$latchname c- @8 K( b$ a g4 @ L# N+ ~
where a.addr = b.laddr(+)
6 w( ~7 Z: s$ m9 l. C7 R# m and a.latch# = c.latch#: I8 d" a. q! S6 Q! o5 D: g3 i$ y
order by a.latch#;
' T2 F Q: O: U7 x /* 由latch名称显示对latch的统计 */5 m, {6 P# J6 _' {
select c.name,a.addr,a.gets,a.misses,a.sleeps,, r0 Y8 Y+ l7 E
a.immediate_gets,a.immediate_misses,b.pid
% |' ]" P- {+ w1 D8 L$ B from v$latch a, v$latchholder b, v$latchname c3 b) C- W* T0 j. V! Y c6 C
where a.addr = b.laddr(+) and a.latch# = c.latch#
) P7 J- y' d0 N9 y6 j& e. F and c.name like '&latch_name%' order by a.latch#;2 e9 e+ u& Q* v
latch有40余种,但作为DBA关心的主要应有以下几种:
) o8 I B2 ^2 B0 U, ~ Cache buffers chains latch: 当用户进程搜索SGA寻找database cache buffers时需要使用此latch。" |6 D: q- G' ^: P% d5 |
Cache buffers LRU chain latch: 当用户进程要搜索buffer cache中包括所有 dirty blocks的LRU (least recently used) 链时使用该种latch。; d2 {4 o" d+ ^0 C6 E# C
Redo log buffer latch: 这种latch控制redo log buffer中每条redo entries的空间分配。
+ m8 ^7 J6 P' `$ w, x. v+ r Row cache objects latch: 当用户进程访问缓存的数据字典数值时,将使用Row cache objects latch。* e4 y6 i' ?0 b$ f7 q; ~
下 面我们将着重介绍一下如何检测和减少redo log buffer latch的冲突。对redo log buffer的访问是由redo log buffer latch来控制的,这种latch有两种类型, redo allocation latch和redo copy latch。
3 i' m; `! R* M- o7 B( m Redo allocation latch控制redo entries在redo log buffer中的空间分配。Oracle的一个用户进程只有得到redo allocation latch后才能为redo entries在redo log buffer中分配空间,又由于一个instance只有一个redo allocation latch,所以一次只有一个用户进程在buffer中分配空间。当用户进程获得latch后,首先为redo entry分配空间,然后进程继续持有latch并拷贝entry到buffer中,这种拷贝称为“在redo allocation latch上的拷贝”(copying on the redo allocation latch),拷贝完毕后,用户进程释放该latch。
& ~- j5 M) U- w% X& L 一个“在redo allocation latch上的拷贝”的redo entry的最大值是由初始化参数LOG_SMALL_ENTRY_MAX_SIZE定义的,根据操作系统的不同而不同。 L2 w0 N( o+ A2 i0 y& u
Redo Copy Latch只应用于多CPU的系统。在多CPU的instance中,如果一个redo entry太大,超过了LOG_SMALL_ENTRY_MAX_SIZE定义值,则不能进行“在redo allocation latch上的拷贝”, 此时用户进程必须获取redo copy latch。一个instance中可以有多个redo copy latch,其数目由初始参数LOG_SIMULTANEOUS_COPIES决定,缺省值为CPU数目。& |! m$ k% L: W( w" w! X5 @& G
在单CPU情况下,不存在redo copy latch,所有的redo entry无论大小, 都进行“在redo allocation latch上的拷贝”。
+ W7 I1 p W) `8 ~9 g; z7 V 对redo log buffer的过多访问将导致redo log buffer latch的冲突,latch冲突将降低系统性能,我们可通过如下查询来检测这种latch冲突:
4 Y' i# |9 G) L* Y' ] col name for a40
^: D: ~4 |/ J2 Y$ H' g5 { SELECT ln.name,gets,misses,immediate_gets,immediate_misses
/ Y. X- d+ b3 n1 r1 @ FROM v$latch l,v$latchname ln
# w; Z% y" y3 b2 S, ?5 d WHERE ln.name IN('redo allocation','redo copy') AND ln.latch#=l.latch#
2 D; Y5 F. x8 Q7 p; g6 V, ~! d /
$ g/ ]4 |" J. V 若misses与gets的比例超过1%或immediate_misses与(immediate_gets+immediate_misses)比例超过1%时,应考虑采取措施减少latch的冲突。
8 | y* P: u# t 大 多数的redo log buffer latch冲突是在多个CPU情况下,两个或多个Oracle进程试图同时得到相同的latch发生的。由于一个instance只有一个redo allocation latch,为减少redo allocation latch的冲突,应减少单个进程持有latch的时间,这可以通过减小初始参数LOG_SMALL_ENTRY_MAX_SIZE以减小redo entry的数目和大小来实现。如果观察到有redo copy latch冲突,可以通过增大LOG_SIMULTANEOUS_COPIES 初始参数来加大latch数目,其缺省值为CPU数目,最大可增大到CPU数目的两倍。 |