转:
http://carson.ycool.com/post.1264755.html
- oracle 采用 latch、enqueue、distribute lock 、global lock等来进行‘锁’的管理
- Latches are low level serialization mechanisms used to protect shared data structures in the SGA. A latch is a type of a lock that can be very quickly acquired and freed
- Enqueue 是另外一种锁,An enqueue is a more sophisticated mechanism which permits several concurrent processes to have varying degree of sharing of "known" resources. Any object which can be concurrently used, can be protected with enqueues. 它于 latch的不同之处在于,它是OS级别的,由OS的lock manger 来进行管理,并且严格遵守FIFO,而latch 确不然,很有可能是先申请latch的进程,却最后得到latch
- A process acquires a latch when working with a structure in the SGA (System Global Area). 在process 工作的过程中持有,在工作结束的时候释放,在process 意外结束的时候,由PMON 来收拾残局
- Latch 有两种,一个是willing-to-wait,一个是no wait
- 如果一个process 申请latch 没有申请的到,就开始spin,spin的次数有_spin_count参数来决定,当达到_spin_count的值时,就开始休眠,休眠时间为0.01秒
- 主要相关视图:v$latch,v$latch_misses,v$latch_name,
主要的Latch
- Cache buffers chains latch: 产生:在data buffer 有block 被access的时候产生; 解决: 减少这个latch 竞争就是要减少sql 的逻辑IO
- Cache buffers LRU chain latch: 产生: 1、当一个新的block 被读到data buffer 的时候 2、data 从databuffer 写到disk 3、对Data buffer 进行scan 以获得那些block是dirty 时候; 解决: 1、加大data buffer,但是这对于FTS 比较多的系统并不中用 2、设置Multiple buffer pools 3、加大DB_BLOCK_LRU_LATCHES 参数的值 4、always ensure DB_BLOCK_LRU_STATISTICS is set to FALSE
- Redo allocation latch: 产生:在log buffer中分配空间的时候获得,一个instance 只有一个Redo allocation latch ; 解决:1、加大log buffer 2、设置 nologging 选项
- Redo copy latch: 产生:当系统将redo records 写到log buffer 的时候产生;
- Library cache latch: 产生:The library cache latches 保护cached 的sql 语句,以及cached 的object 的定义,它是当将新的解析的sql 语句 插入到library cache 的时候产生,该值过大,表示hard parse 过多; 解决: 1、绑定变量 2、 适当加大shared pool 3、加大_KGL_LATCH_COUNT 参数
- Library cache pin latch: 产生: 当cached sql 语句再次被执行的时候产生,这个latch 的严重丢失表明sql 被严重的多次执行; 解决: 几乎没有办法来解决该问题,一个效果不大的办法是书写:a.b 类似的sql
- Shared pool latch: the shared pool latchis used to protect critical operations when allocating and freeing memory in the shared pool. 解决: 1、绑定变量 2、避免hard parse 3、尽量一次解析多次执行 4、适当的shared_pool 5、MTS
- Row cache objects latch: 产生: 当用户进程读取数据字典定义的时候 解决: 加大shared_pool
如果一个系统中的CPU 很繁忙,就应该减少_SPIN_COUNT 的值,反之,就应该增加