http://www.xifenfei.com/1109.html
当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们称其这hash chains,chain在中文的意为链条或串的意思,表达就是关连性.如果一个进程想访问或修改hash chain上的block,它首先要获得”cache buffers chains” latch。
原因一:低效率的SQL语句(主要体现在逻辑读过高)
cache buffers chains latch很大程度与逻辑读有关,所以要观注v$sql中BUFFER_GETS/EXECUTIONS大的语句。
同时每一个逻辑读需要一个latch get 操作及一个cpu操作,这样的sql也会很耗cpu资源。
cache buffers chains锁存器的争用原因一:低效率的SQL语句
在某些环境中,应用程序打开执行相同的低效率SQL语句的多个并发会话,这些SQL语句都设法得到相同的数据集。较小的逻辑读意味着较少的latch get操作,从而减少锁存器争用并改善性能。
每次执行都带有高 BUFFER_GETS(逻辑读取)的SQL语句是主要的原因。
原因二:热块(访问过于频繁)
cache buffers chains锁存器的争用原因二:热块
当多个会话重复访问一个或多个由同一个子cache buffers chains锁存器保护的块时,热块就会产生。当多个会话争用cache buffers chains锁存器时,找出是否有热块的最好的方法是检查latch free等待事件的P1RAW参数值
找出热点块方法一:
--找出p1raw
select
p1,p1raw
from
v$session_wait
where
event=
'latch: cache buffers chains'
;
--找到对象
SELECT
/*+
RULE
*/
E.OWNER ||
'.'
|| E.SEGMENT_NAME SEGMENT_NAME,
E.PARTITION_NAME,
E.EXTENT_ID EXTENT#,
X.DBABLK - E.BLOCK_ID + 1 BLOCK#,
X.TCH,
L.CHILD#
FROM
SYS.V$LATCH_CHILDREN L, SYS.X$BH X, SYS.DBA_EXTENTS E
WHERE
X.HLADDR =
'00000002576EE018'
--p1raw
AND
E.FILE_ID = X.FILE#
AND
X.HLADDR = L.ADDR
AND
X.DBABLK
BETWEEN
E.BLOCK_ID
AND
E.BLOCK_ID + E.BLOCKS - 1
ORDER
BY
X.TCH
DESC
;
|
找出热点块方法二:
--直接找出热点块
SELECT
OBJECT_NAME, SUBOBJECT_NAME
FROM
DBA_OBJECTS
WHERE
DATA_OBJECT_ID
IN
(
SELECT
DATA_OBJECT_ID
FROM
(
SELECT
OBJ DATA_OBJECT_ID, FILE#, DBABLK, CLASS, STATE, TCH
FROM
X$BH
WHERE
HLADDR
IN
(
SELECT
ADDR
FROM
(
SELECT
ADDR
FROM
V$LATCH_CHILDREN
ORDER
BY
(GETS + MISSES + SLEEPS)
DESC
)
WHERE
ROWNUM < 10)
ORDER
BY
TCH
DESC
)
WHERE
ROWNUM < 10);
|