当发生cache buffer chain 的时候大家都知道去V$SESSION_WAIT 中查看child_latch_address 然后关联X$BH的HLADDR 来查看这个latch 控制了哪些object。
然后呢?大家可能会根据BH 的TCH 字段排个序 看看哪个count 高那么问题可能就发生在哪个object上。
可是这样却不一定能够100%的定位问题所在,众所周知tch字段随着一段时间不用就会自动递减,但是实际上他的自增也是有学问的。
oradebug setospid 29117
SQL> oradebug dumpvar sga kcbatt_
ub4 kcbatt_ [060013DE8, 060013DEC) = 00000003
这个参数控制了 每隔3秒 touch 一次 count 才会加1 但是如果3秒touch 100次 他还是+1;
这样道理就很简单了 有一个SQL 每3秒touch一次 理论上会发生28800次最大碰触。
而另一个SQL 却是每秒检索100次,10秒后他又检索100次,那么tch显示他发生了8640次碰触,可实际上他是8640*100次。
可是这样的SQL你却无法检验出来。
LatchProfX.sql =Latch Profile extends.
Oracle 大师Tanel Poder的工具,可以很轻易的解决这个问题,
SID USERNAME MACHINE EVENT PARAM W WT SQL ST LT LOGON_TIME
1085 EDW1_USER xen19-vm05 latch: cache buffers chains 0x27E5A780 -1 237 g7svvy17z645h/1tmc2nfqrznv3 A 5529 8539
SQL> @latchprofx sid,name,hmode,object % 27E5A780 100000 SID NAME HMODE OBJECT Held Gets Held % Held ms---- ---------------------- ------------ ------- ------ ----- ------- -------- 1085 cache buffers chains exclusive 40EB02 3928 3797 3.93 41.637 151 cache buffers chains exclusive 40EB02 3711 3660 3.71 39.337 138 cache buffers chains shared 40EB02 623 623 .62 6.604 151 cache buffers chains shared 40EB02 544 544 .54 5.766 SQL> @dba 40EB02 RFILE# BLOCK#---------- ---------- 1 60162 Press enter to find the segment using V$BH (this may take CPU time), CTRL+C to cancel: STATE BLOCK_CLASS OBJECT_TYPE object TCH MODE_HELD---------- ------------------ ------------------- ---------------------------------------- ---------- ----------xcur data block INDEX SYS.SYS_IOT_TOP_94276 331 1 Press enter to query what segment resides there using DBA_EXTENTS (this can be IO intensive), CTRL+C to cancel: OWNER SEGMENT_NAME PARTITION_NAME TABLESPACE_NAME------------------------------ -------------------- --------------- -----------------SYS SYS_IOT_TOP_94276 SYSTEM
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21818314/viewspace-693215/ ,如需转载,请注明出处,否则将追究法律责任。