Oracle熱快-從認識到定位



必知:java

Latch集中於Buffer Cache的競爭和Shared Pool的競爭。和Buffer Cache相關的主要Latch競爭有cache buffers chains和cache buffers lru chain,和Shared Pool相關的主要Latch競爭有shared pool latch和library cache latch等。sql

Buffer Cache的Latch競爭常常是因爲熱點塊競爭引發的;Shared Pool的Latch競爭一般是因爲sql的大量硬解析引發的。緩存


      CBC latch簡介

      熱快是一種致使Oracle cache buffers chains latch(cbc)等待事件最多見的緣由,網絡上有大多隻是簡單的將熱快做爲產生CBC等待事件的代名詞,網絡

其實產生cbc等待事件有兩種常見的緣由:session

引自Tom大師:
The first main type of latch that will be detailed for Oracle is called the buffer cache latch. 
The buffer cache latch family consists of two types of latches: 
the cache buffers chain latch;
the other is the cache buffers LRU chain latch. 

Another factor for latch contention with buffers chain latches could possibly be hot block contention. Oracle Metalink Note # 163424.1 has some useful tips on tuning and identifying hot blocks within the Oracle database environment.
The other buffer cache latch type is the cache buffers LRU chain latch. Whenever a new block enters the Oracle buffer cache within the SGA, this latch is acquired to allow block management in the Oracle SGA.

Also, the latch is acquired when buffers are written back to disk such as when a scan is performed to move the LRU or least recently used chain of dirty blocks to flush out to disk from the buffer cache.

第一種:熱快(hot block);ide

第二種:cachebuffers LRU chain( cache buffers LRU chain latch)性能


再看看Oracle官方文檔對CBClatch描述:
優化

Latch: cache buffer chains (%)

Description--描述
The cache buffers chains latches are used to protect a buffer list in the buffer cache. These latches are used when searching for, adding, or removing a buffer from the buffer cache.
--cbclatch用來保護buffercache中的buffer列表。
這些latch可從buffer中進行搜索、添加、移除。

Blocks in the buffer cache are placed on linked lists (cache buffer chains) which hang off a hash table. The hash chain that a block is placed on is based on the DBA and CLASS of the block. Each hash chain is protected by a single child latch. Processes need to get the relevant latch to allow them to scan a hash chain for a buffer so that the linked list does not change underneath them.
--處於緩存區中的塊被擱置在buffer列表上,這些塊掛着一個hash表。
--掛載哈希鏈的塊是基於DBA 和 CLASS塊,每個hash鏈被一個子latch所保護。而進程須要訪問buffer中的塊必須先得到cbclatch。


CBC latch等待事件代言人——熱快

Contention on this latch usually means that there is a block that is in great contention (known as a hot block).
--這種latch爭用一般意味着塊的爭用(這就是所謂的熱快),也就是說默認CBClatch爭用指的就是熱快。


尋找熱快對象

提供兩種方法:
ui

第一種,來自Oracle官方文檔:

1.首先經過v$latch_children視圖定位訪問緩存鏈較多且持有塊多的內存地址以及休眠時間:this

SELECT 
      addr,
      sleeps
FROM 
      v$latch_children c,
      v$latchname n
WHERE
      n.name='cache buffers chains' and
      c.latch#=n.latch# and
      sleeps > 100
ORDER BY sleeps
/

2.而後從v$bh 以及根據v$latch_children.add相關聯,獲取具體的文件和數據塊號

SELECT file#, dbablk, class, state, TCH
  FROM X$BH
  WHERE HLADDR='address of latch';
  --tch解釋:tch:touch count for the buffer,經過tch來定位熱快

3.最後經過上述2獲取的數據塊地址,再根據dba_extents定位具體的段。



第二種,來自Tom大師:

首先經過v$session_wait查找文件number號即P1:

select
   p1 "File #",
   p2 "Block #",
   p3 "Reason Code"
from
   v$session_wait
where
   event = 'buffer busy waits';

而後根據獲取的file,block信息,經過dba_extents,查找具體的塊

select 
   owner,
   segment_name,
   segment_type
from 
   dba_extents
where 
   file_id = &P1
and 
  &P2 between block_id and block_id + blocks -1;


總結:

1.產生cbc等待事件的緣由是熱快,也就是說出現熱快,就會出現cbc等待事件;

2.經過v$session_wait,x$bh,dba_extents相關聯,直接定位熱快的對應的具體段;

3.熱快的優化無非就是優化SQL,具體的優化說來話長,固然後續有機會再慢慢說。



最後提供Oracle社區直接定位熱快的腳本:

select /* 當心使用此腳本,有性能問題-如有疑問,請留言*/
   e.owner ||'.'|| e.segment_name segment_name,
   e.extent_id extent#,
   x.dbablk - e.block_id + 1 block#,
   x.tch,
   l.child#
from
   sys.v$latch_children l,
   sys.x$bh x,
   sys.dba_extents e
where
   x.hladdr = 'ADDR' and
   e.file_id = x.file# and
   x.hladdr = l.addr and
   x.dbablk between e.block_id and e.block_id + e.blocks -1
order by x.tch desc;



腳本定位產生熱快的SQL語句,請移步

http://my.oschina.net/1272149624/blog/613508

相關文章
相關標籤/搜索