2018.03.08
Library cache pin
目次
Basic Info
library cache pinは、Library Cacheオブジェクトの実行や変更時にlibrary cache object(LCO)について取得するロックです。Library cache pinを獲得する過程で競合が発生した場合library cache pinイベントを待機します。library cache pinイベントのP1 = handle address、P2 = lock address、P3 = mode * 100 + namespaceでどのオブジェクトに対してどのようなモードでロックを獲得する過程で競合が発生したか把握することができます。Library cache pinはlibrary cache lockを獲得した後、library cacheオブジェクトに対して追加の作業が必要なときに獲得することになります。たとえば、特定のプロシージャやSQL文を実行しようとするプロセッサは、library cache lockをSharedモードで獲得した後で、library cache pinをSharedモードで獲得しなければなりません。プロシージャをコンパイル(alter procedure … compile …)する場合には、library cache pinをExclusiveに獲得しなければなりません。ピン(pin)という用語の意味は、LCOにピンを差し込むことで、ピンが差し込まれている間、LCOの値が変動しないように保証される役割をさします。実際には、ハード解析が発生した場合、ハード解析が行われる間、対応するSQLカーソルのlibrary cache pinをExclusiveに獲得するというものです。
一般的に、現在の多く使用されるオブジェクトのDDL(テーブルの変更、ビュー、プロシージャのコンパイルなど)コマンドを実行する場合library cache pin待機イベントが多く発生することになります。したがって業務時間中にオブジェクトの変更はなるべくご遠慮しなければなりません。もし、そのイベントが広範囲に発生した場合、shared poolのチューニングが必要になることもあります。そのイベントが発生した場合は、以下のSQLを実行して、ピンを占有しているセッションとモードを確認することができます。
select s.sid, kglpnmod "Mode", kglpnreq "Req" from x$kglpn p, v$session s where p.kglpnuse=s.saddr and kglpnhdl='&P1RAW' ; SID Mode Req ------------------------- 8 2 0 25 0 3
もし実行結果が上記通りであるならば、8回のセッションが25回のセッションのlibrary cache pin待機のホルダー(holder)セッションであることを示します。また、8回のセッションは、sharedモード(2)でピンを所有しており、25回のセッションは、exclusiveモード(3)でピンを所有するために待機しています。
Parameter&Wait Time
Wait Parameters
library cache pin待機イベントは、待機パラメータを使用していません。
・P1:ピン(pin)大気と関連するオブジェクトのメモリアドレス ・P2:ピン(pin)のメモリアドレス ・P3:モード(mode)と名前空間(namespace)。モードは2(Shared)と3(Exclusive)に区分され、 名前空間はV$ LIBRARYCACHEまたはV$ DB_OBJECT_CACHEビューで表示されるNAMESPACEを意味します。
オラクル7.0から8.1.7までの10* Mode+ Namespaceで表現され、Oracleの9.0から9.2までは100* Mode+ Namespaceに表現されます。Namespace部分は番号で表示され、番号に対応する名前空間は、次のとおりです。
0 | Sql Area |
1 | Table / Procedure / Function / Package Header |
2 | Package Body |
3 | Trigger |
4 | Index |
5 | Cluster |
6 | Object |
7 | Pipe |
13 | Java Source |
14 | Java Resource |
32 | Java Data |
Wait Time
PMONプロセスは、1秒まで待機し、他のプロセスは、3秒まで待機します。この待機時間後にピンを獲得していない場合、繰り返し待機します。
Check Point&Solution
業務時間中DDLの実行を避ける
Library cache lock待機による性能低下現象は、ほとんどの不適切なDDL(create、alter、compile、flushなど)によって発生します。したがって、トランザクションが旺盛なシステムに対してDDLを実行するときは、この内容を十分に考慮した後に実行するようにしなければなりません。たまにハード解析が盛んなシステムでshared poolメモリ枯渇を避けるために(ORA-4031エラーを回避するために)flushを実行する場合がありますが、システムに悪影響を与える場合が多くあります。
Event Tip
Library Cacheの構造
latch:library cache#Library Cache構造を参照してください。
SQLの実行順序
latch:library cache#SQLの実行を参照してください。