1.何为latch

我们先想象以下场景:"一个数据块正在被一个会话(A)从磁盘中读入到内存中,请注意,是正在读取中,此时,如果另外一个会话(B)也正需要这个数据块,B该怎么做呢?"

其实结果不难猜测,我们需要等待这个数据块被读取到内存中,这样就可以只有一个数据块在内存中,不会导致数据的不一致性。那么A如何能够阻止B继续读取这个数据块呢?方法是他需要获取一种像锁一样的资源,以便于阻止其他的会话来做相同的事情,这种资源,在oracle数据库中成为latch。

latch大概就是上面所述的这样的东西,它用以保护SGA区中共享数据结构的一种串行化锁机制,是一种能够极快的被获取或释放的锁,能快速,短时间的锁定资源,防止多个并发进程同时修改某个共享资源

注:latch不会用于PGA区,因为latch是因为会话对内存中某数据的争用,导致的一种锁机制。

2.latch的等待和lock的阻塞的不同。

oracle—锁与阻塞 中我们认识了oracle的锁,锁是因为代码逻辑的不正确,导致在访问表中数据时,产生了会话间的阻塞甚至死锁。

latch是因为会话在访问共享内存数据时,为了保护内存结构而产生的一种锁的机制。所以latch只会导致会话间非常短暂的等待。

 

3.常见的latch

4.latch的获取机制。

latch既然是保护内存结构的一种串行化锁机制,说明一次只能一个会话拥有latch。别的会话则只能等待。

这种等待是短暂的,那么它又是如何等待的呢?

5.latch在哪儿,在什么时候会出现latch争用

注:共享池和数据缓冲池的latch争用只是最常见的两种。

 5.1共享池的latch争用——绑定变量

oracle sql语句执行过程图文解析 我们知道了:sql语句进入oracle服务器,是先到SGA区进行解析,并查找是否SGA区里存放了该语句的执行计划,从而达到重用。

所以:共享池中如果存在大量的SQL语句被反复分析,就很可能造成latch争用和长时间等待,常见的现象是由于没有绑定变量造成的。

在分析系统性能时,如果有library cache这样的latch争用,基本可以断定是共享池中出现的问题,这种问题是由SQL语句导致的,比如没有绑定变量或者一些存储过程被反复分析。

5.2数据缓冲池latch争用——热块

5.2.1 buffer cache的机制

 

5.2.2 latch争用—热块

访问频繁非常高的数据块被称为热块,当很多用户一起去访问某几个数据块时,就会导致一些latch争用,最常见的latch争用是:

  • buffer busy wait
  • cache buffer chain

这两个latch的争用分别发生在访问数据块的不同时刻。

cache buffer chain :当一个会话需要去访问一个内存块时,它首先要去搜索这个数据块是否在内存中,当会话去搜索内存时,就会获取一个latch,如果获取失败,

将会产生latch cache buffer chain 等待。导致这个等待的原因是访问相同数据块的会话太多或者这个列表太长。

buffer busy wait:当一个会话需要访问一数据块,而这个数据块正在被另外一个用户从磁盘读取到内存中或者这个数据块正在被另一个会话修改时,当前的会话就需要等待,就会产生一个buffer busy waits 等待。

产生这些latch争用的直接原因是太多的会话去访问相同的数据块导致热块问题,造成热块的原因可能是数据库设置导致或者是重复执行的SQL频繁访问一些相同数据块导致。

根据热块产生的原因不同,按照数据块的类型,可以分为

  • 表数据块
  • 索引数据块
  • 索引根数据块
  • 文件头数据块

5.2.3latch优化方法

  • 统计一定时间段中latch争用情况

  • 获取latch争用的会话和sql语句

  • AWR报告获取latch争用情况

5.2.4 latch 优化思路

由图可知:latch争用最好从AWR报告下手

 

posted on 2018-01-15 16:43  进_进  阅读(1066)  评论(0)    收藏  举报