经常有人把latch造成的等待事件误认为是lock造成的阻塞,其实这是两个完全不同的概念。在性能优化上,如果能够区别开这两个因素引起的性能问题,将能极大地提高我们的性能分析判断能力。
Latch是oracle为了
保护内存结构而发明出的一种资源,按照它保护的资源类型不同,可以把latch分成很多种。可以把latch理解为一种轻量级的锁,它不会造成阻塞,只会导致等待。这是两个截然不同的概念。
阻塞,是一种系统设计上的问题,而等待是一种系统资源争用的问题。
还可以参考java的阻塞和等待:
http://www.outflush.com/2014/07/difference-between-block-and-wait-in-java/
导致latch争用而等待的原因非常多,内存中很多资源都可能存在争用。下面介绍两类最常见的latch争用,他们都会导致数据库的性能下降,这是一个DBA在做数据库性能分析和优化时必须知道的知识:
(1) 共享池中的latch争用
(2) 数据缓冲池中的latch争用
3.1 共享池中的latch争用
共享池中如果存在大量的sql被反复分析,就会造成很大的latch争用和长时间的等待,
最常见到的现象是没有绑定变量。最常见的几种共享池里的latch是:
Select * from v$latchname where name like ‘library cache%’
Latch# name
157 library cache
158 library cache pin
159 library cache pin allocation
160 library cache load lock
在分析系统性能时,如果看到有library cache这样的latch争用,就可以断定是共享池出了问题,这种问题基本上是由sql语句导致的,比如没有绑定变量或者一些存储过程被反复分析。
3.2 数据缓冲池latch争用
访问频率非常高的数据块被称为热块(hot block),当很多用户一起访问某几个数据块时,就会导致一些latch争用。最常见的latch争用是:
(1) buffer 不适用waits
(2) cache buffer chain
这两个latch的争用分别发生在访问数据块的不同时刻。
当一个会话需要去访问一个内存块时,它首先要去一个像链表一样的结构去搜索这个数据块是否在内存中,当会话访问这个链表时需要获得一个latch,如果获取失败,将会产生latch cache buffer chain等待,导致这个等待的原因是访问相同数据块的会话太多或者这个列表太长。
当一个会话需要访问一个数据块,而这个数据块正在被另外一个用户从磁盘读取到内存中或者这个数据块正在被另一个会话修改时,当前的会话就需要等待,就会产生一个buffer busy waits等待。
产生这些latch争用的直接原因是太多的会话去访问相同的数据块导致热块问题,
造成热块的原因可能是数据库设置导致或者是重复执行的sql频繁访问一些相同数据块导致。
热块产生的原因不尽相同,按照数据块的类型,可以分为以下几种热块类型,不同的热块类型处理的方式都是不同的:
(1) 表数据块
(2) 索引数据块
(3) 索引根数据块
(4) 文件头数据块
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐