共享池之六:shared pool latch/ library cache latch /lock pin 簡介

還不算暈發表於2014-03-16

latch:library cache --desc v$librarycache;

latch:library cache用於保護hash bucket.
library cache lock保護HANDLE。
library cache pin保護library cache object--LCO.
從10G開始,library cache lock和library cache pin被MUTEX部分取代。暫時不討論MUTEX。
latch:library cache的數量:
SYS@ bys3>select name from v$latch_children where name like '%librarycache%';
隱含引數:_kgl_bucket_count,預設值大於等於系統中CPU個數的最小素數-不超過67。查詢時會顯示為0--BUG。
一個latch:library cache管理著多個librarycache buckets.

latch:library cache多是因為區域性latch:library cache訪問比較頻繁,增大其數量並不能解決。
如果shared pool過小,也會引發librarycache latch競爭,進而引起shared pool latch競爭---參考AWR--Shared Pool Advisory
具有高version_count的SQL也容易導致latch:library cache,因為在搜尋到子LCO前會一直持有latch:library cache。
#########

library cache lock保護HANDLE--父遊標和子游標的handle

在硬解析時,需要以獨佔模式(EXCLUSIVE)持有librarycache lock和library cache pin。
程式訪問LCO,首先需要在latch:librarycache的保護下獲得library cache lock,才能訪問和修改HANDLE;然後獲取library cache pin,才能訪問和LCO。
子游標的HANDLE和LCO的訪問和上面一樣。

MODE有三類: null 1;shared 2;exclusive 3;  

null 1;空鎖:空鎖和獨佔鎖互相不阻塞,主要起“標記”目的。標記物件正在使用中,或者標記物件以後還會用。保證物件記憶體不會被覆蓋或釋放。--可以執行三次,檢視
select kglhdadr,kglhdpar,kglhdlmd,kglobhs0,kglobhd0,kglobhd6 from x$kglob wherekglnaobj like 'select * from aaa';
檢視遊標是否關閉。執行不大於3次,不會快取,如有其它語句,則將未快取的清空。
select * from bys.dept 執行三次,
SYS@ bys3>select kglhdadr,kglhdpar,kglhdlmd,kglhdpmd,kglobhs0,kglobhd0,kglobhd6from x$kglob where kglnaobj like 'select * from bys.dept';
KGLHDADR KGLHDPAR   KGLHDLMD   KGLHDPMD  KGLOBHS0 KGLOBHD0 KGLOBHD6
-------- -------- ---------- ---------- ---------- -------- --------
2499B1C0 24965DB4          1         0       4372 246C5CE0 252F0DD0  ----被快取的子游標,
24965DB4 24965DB4         1         0       4500 23CC848C 00
被快取的遊標:當記憶體不足時,子游標堆6可以被覆蓋,其它HADNLE等不可被覆蓋。--原因是:重建執行計劃的資訊--父堆0,子堆0等都有可以快速重建執行計劃-也算硬解析,但是消耗資源比正常硬解析少。

等待事件的P1 P2 P3分別是:

P1=HANDLE ADDRESS
P2=LOCK/PIN ADDRESS
PS=MODE*100+NAMESPACE
NAMESPACE分以下型別:
1.SQL AREA
2.TABLE/PROCEDURE/FUNCTION/PACKAGE HEADER
3.PACKAGE BADY
4.TRIGGER
5.INDEX
6.CLUSETER
7.PIPE
13.JAVA SOURCE
14.JAVE RESOURCE
32.JAVA DATA

常見的library cache lock持有模式的情況:

以獨佔持有的語句是:
ALTER TABLE……,
CREATE OR REPLACE PROCEDURE;
共享模式持有:SQL解析階段
在SQL執行階段,由共享模式轉換為NULL。
定位引起library cache lock等待事件的語句:
select b.sid from x$kgllk a,v$session b where a.kgllkhdl in (select p1raw fromv$session_wait where wait_time=0 and event='library cache lock') and a.kgllkmod<>0and b.saddr=a.kgllkuse;

常見的library cache pin持有模式的情況:

以獨佔模式持有的是:
ALTER PROCEDURE ..COMPLE;
硬解析產生執行計劃過程中需要
以共享模式持有的是:SQL執行階段、PROCEDURE執行階段。
定位引起library cache pin等待事件的會話:
select a.sid from x$kglpn b,v$session a where b.kglpnhdl in (select c.p1rawfrom v$session_wait c where c.wait_time=0 and c.event like 'library cachepin%') and b.kglpnmod<>0 and a.saddr=b.kglpnuse;


相關文章