经常有人把LATCH 造成的等待事件误认为是LOCK造成的阻塞,其实是两个完全不同的概念。要区别开这两个因素,是性能分析人员必备的判断能力。

       Latch是为了保护内存结构而发明出的一种资源,按照保护的资源类型不同,可以把Latch分成很多种。

       Latch 不会造成阻塞,只会等待。阻塞是系统设计上的问题,等待是一种系统资源争用的问题。

       导致LATCH争用的等待的原因非常多,内存中很多资源都可能存在着争用。Latch争用,都会导致数据库的性能下降。

 

  1. 共享池的Latch争用

如果大量的SQL被反复分析,会造成很大的Latch争用和长时间的等待,最常见的是没有绑定变量导致。

  1. 数据缓冲池Latch争用

访问频率非常搞的数据块被称为热块,当很多用户一起去访问某几个数据块时候,就会导致一些Latch争用。

  1. Buffer busy waits
  2. Cache buffer chain

热块产生的原因不尽相同,可以分为

  1. 表数据块
  2. 索引数据块
  3. 索引根数据块
  4. 文件头数据块

 

    1. 表数据块

如果表不大,可以考虑将表数据分布在更多的数据块上,减少数据块被多数会话同时访问的频率。

 

 

    1. 索引数据块

通常发生在RAC架构里,某个表的索引键值呈现出典型的右倾现象,比如一个表的主键使用一个序列来生成键值,那么这个主键在索引数据块上的键值就是以一个顺序激增的方式排列的。

 

 

 

    1. 索引根数据块

热块也可能发生在索引的根数据块上,在B-TREE索引里,当ORACLE访问一个索引键值时,首选访问索引的根,然后是索引的分支,最后才是索引的叶块,索引的键值就是存储在叶块上面。

 

    1. 段头数据块

在OLTP系统数据库中,一些数据段的Free List 可能会是一个访问很频繁的数据块。