Latch的使用詳解
Latch是Oracle爲了保護內存結構而發明的一種資源。常應用於併發的用戶從磁盤中讀取或寫入數據。最常見的latch爭用有:共享池中latch的爭用和數據緩衝池中latch的爭用。
1、共享池中latch的爭用:
共享池中如果存在大量的SQL語句被反覆分析,就很可能造成latch爭用和長時間等待,常見的現象是由於沒有綁定變量造成的。
SQL> select * from v$latchname where name like 'library cache%'
在分析系統性能時,如果有library cache這樣的latch爭用,基本可以斷定是共享池中出現的問題,這種問題是由SQL語句導致的,比如沒有綁定變量或者一些存儲過程被反覆分析。
2、數據緩衝池中latch的爭用:
當很多用戶一起去訪問某幾個數據塊時,就會導致數據緩衝池的latch爭用,主要有兩種:buffer busy waits 和 cache buffer chain。訪問頻率高的數據塊被稱爲熱塊(hot block),當很多用戶同時訪問相同的數據塊就會導致熱塊問題,造成熱塊的原因可能是數據庫設置導致或者重複執行的SQL頻繁的訪問一些相同的數據塊導致的。
2.1查詢當前數據庫最繁忙的Buffer:TCH(Touch)表示訪問次數越高,熱點塊競爭問題就存在
select *
from (select addr,
ts#,
file#,
dbarfil,
dbablk,
tch
from x$bh
order by tch desc)
where rownum<11;
2.2結合dba_extents查詢得到這些熱點Buffer來自哪些對象
select e.owner, e.segment_name, e.segment_type
from dba_extents e,
(select *
from (select addr, ts#, file#, dbarfil, dbablk, tch
from x$bh
order by tch desc)
where rownum<11) b
where e.relative_fno=b.dbarfil
and e.block_id<=b.dbablk
and e.block_id+e.blocks>b.dbablk;
2.3結合SQL視圖可以找到操作這些對象的相關SQL,然後通過優化SQL減少數據的訪問,或者優化某些容易引起爭用的操作(如connect by等操作)來減少熱點塊競爭
break on hash_value skip 1
select /*+ rule */ hash_value,sql_text
from v$sqltext
where (hash_value, address) in
(
select a.hash_value, a.address
from v$sqltext a,
(select distinct a.owner, a.segment_name, a.segment_type
from dba_extents a,
(select dbarfil, dbablk
from (select dbarfil, dbablk
from x$bh
order by tch desc)
where rownum<11) b
where a.relative_fno = b.dbarfil
and a.block_id <= b.dbablk
and a.block_id + a.blocks > b.dbablk) b
where a.sql_text like ‘%’ || b.segment_name || ‘%’
and b.segment_type = ‘TABLE’)
order by hash_value, address, piece;