本次主要讲解一下性能优化中latch中使用,latch分三次讲解,本次是第一次,主要是对lacth的基本的认知,如果您对我写的感兴趣,一定要让您的好朋友关注哦。
1、Oracle机制中拥有latch的目的
1)保证资源的串行访问:
保护SGA的资源访问
保护内存的分配
2)保证执行的串行化:
保护关键资源的串行执行
防止内存结构损
2、Lock和Lacth的区别
Lock 是可以长时间的,Latch 是非常短时间的。一般保护的是会话
Latch 是保护内存的,Lock 是保护数据库对象的 。
Lock分表级锁,行级锁,也可以分共享锁、独占锁,就是对比进行操作时进行锁定。
Latch是内存锁。比方说,一个数据块,被加载到内存中,当多个会话对该内存中的块进行争用时,使用的锁。
3、Latch 的争用
首先我把latch大致分为3个方向上的争用。
第一、高CPU占用可能会触发latch争用问题。
第二、Oracle期望latch被进程短暂的、简短的占用
第三、Latch争用的性能问题也可能并不是由于Latch 持有时间太长,而仅仅是因为获取Latch的请求太过频繁了。
4、latch视图:
v$latch_misses视图保存了latch失败在oracle内核代码中的区域信息。这些信息对于oracle support诊断latch等待事件会有帮助的.
SQL> desc v$latch_misses
名称 是否为空? 类型
----------------------------------------------------- -------- ------------------------------------
PARENT_NAME VARCHAR2(50)
WHERE VARCHAR2(64)
NWFAIL_COUNT NUMBER
SLEEP_COUNT NUMBER
WTR_SLP_COUNT NUMBER
LONGHOLD_COUNT NUMBER
LOCATION VARCHAR2(64)
1)WTR_SLP_COUNT:字段记录进程在此内核位置等待者请求对应latch时的休眠次数.就像我持有一个短期的latch(0.08秒),但是并发很多,有1000多个进程想获取该latch,他们身份是等待者,会进入休眠。
2)SLEEP_COUNT:字段记录进程在此内核位置获取锁的这个获得者休眠的次数.这个是已经获取了该latch,但是之前再该latch的位置休眠过几次。
3)LONGHOLD_COUNT:字段记录因为一个latch在整个spin循环后仍然被其他进程hold,该进程转入sleep的次数,这是我们常规的休眠次数。
其实就是整个latch在spin循环中进入休眠的次数。
v$latch_misses中的数据可以查看任何latch争用问题。
4、示例:我们在共享池的两个latch经常出现这样,或者那样的故障问题,
shared pool latch与library cache latch;我来简单帮大家介绍下吧:
Shared pool latch争用通常是由于硬分析引起,硬分析需要分配新的游标。硬分析过多说明sql语句没有充分绑定变量。硬分析是代价十分昂贵的操作,硬分析需要申请空闲列表(list of free chunks),分配空间时一直持有shared pool latch。
如果频繁的申请空闲空间,必然导致shared pool latch的冲突,而在分析期间需要一直持有ibrary cache latch。 硬分析需要分配新的游标,或者将已经换出的游标重新装载,在整个分析阶段都需要持有library cache latch。




