Latch和等待(一)

来源:互联网 发布:网络威胁类型 编辑:程序博客网 时间:2024/05/22 05:17

    首先Latch造成的等待并不等同于lock造成的阻塞,oracle为了保护内存结构而发明出的一种资源,在oracle复杂的内存结构中,各种数据被反复从磁盘读取到内存中,又被重新写回到磁盘上,如果有并发的用户做相同的事情,oracle必须使用一种机制,来保证数据在读取的时候,只能由一个会话来完成,这种保护机制就用到了latch。

    可以把latch理解成一种轻量级的锁,它不会造成阻塞,只会引起等待,这是两个截然不同的概念。阻塞是 一种系统设计上的问题,而等待是一种系统资源争夺的问题,弄清这两个概念后,就能够对系统性能下降时,作出客观的判断。如果发现系统中,经常由于LOCK导致用户等待,这是需要考虑系统在逻辑设计上是否有问题,比如多用户对主键的删除或是修改,是否有用户使用select for update 这样的语法,外键是否创建索引等因素,这些 因素是需要结合系统的业务逻辑性来进行数据库对象设计的;而当我们发现系统缓慢的原因是由于很多latch争用的时候,要考虑系统及数据库自身设计上是否由问题,比如是否绑定变量,是否有热快存在,数据存储参数设计是否合理等因素。

 

    导致latch争用而等待的原因有很多,内存中很多资源都可能存在这争用,下面介绍两种常见的latch争用,它们会导致数据库的性能下降:

    1:共享池中的latch争用

          共享池中如果存在大量的sql被反复分析,就会造成很大的latch争用和长时间的等待,最常见的现象是没有绑定变量。

          通过select * from v$latchname where name like 'library cache';查看共享池中最常用的几种latch

    LATCH# NAME                                                     HASH
---------- -------------------------------------------------- ----------
       214 library cache                                      3055961779

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

    2:数据缓冲池Latch争用

         当一个会话需要去访问一个内存块时,它首先要去一个像链表一样的结构中去搜索这个数据块是否在内存中,,当会话访问这个链表时要获得一个latrch,如果获取失败,将会产生latch等待,倒是这个等待的原因是访问相同数据块的会话太多或者这个列表太长(如果读到内存中的数据块太多,需要管理数据块的hash列表就会很长,其他会话获取这个latch的机会就会降低,等待就会增加。)

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

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

        产生热快的原因很多,按照数据块的类型,可以分为以下几种热快类型,不同的热快类型处理都是不同的:

        A:表数据块

        B:索引数据块

        C:索引根数据块

        D:文件头数据块

        A:表数据块

              比如在oltp系统中,对于一些小表,会出现某些数据块被频繁的查询或者修改的操作,这时候这些频繁访问的数据块就会变成热快,导致内存中latch争用。 

    如果出现这样的热快问题,并且表不太大,一个方法是可以考虑将表数据分布在更多的数据块上,减少数据块被多数会话同时访问,可以通过下面的命令将每个数据块存放记录的数量见到最少:alter table minimize records_per_block;

 

待续。。。

原创粉丝点击