library cache lock / library cache pin 이벤트

1. 파라메터 정보

  • P1 = handle address
  • P2 = lock address
  • P3 = mode*100 + namespace
    • 오라클 7.0부터 8.1.7 까지는 mode*10 + namespace로 표현되며, 오라클 9.0부터는 mode*100 + namespace로 표현된다. namespace 부분은 번호로 표시된다.
    • < mode >
      • 1: Null
      • 2: Shared
      • 3: Exclusive
    • < namespace >
      • 0: SQL Area
      • 1: Table/Procedure/Function/Package header
      • 3: Trigger
      • 4: Index
      • 5: Cluster
      • 6: Object
      • 7: Pipe
      • 13: Java Source
      • 14: Java Resource
      • 32: Java Data
    • P3=200 => Shared + Cursor
    • P3=301 => Exclusive + Procedure

library cache lock

1. LCO를 접근하거나 변경하는 경우, Handle에 대해 획득하는 Lock
2. LCO의 스펙을 보호, 즉 파싱 과정 동안 LCO의 정의가 변경되는 것을 방지함

  • DBA_KGLLOCK : KGL objects가 홀드하고 있는 모든 lock과 pin 리스트
ColumnDatatypeNULLDescription
kgllkuseRAW(4)Address of the user session that holds the lock or pin
kgllkhdlRAW(4)Address of the handle for the KGL object
kgllkmodNUMBERCurrent mode of the lock or pin
kgllkreqNUMBERMode in which the lock or pin was requested
kgllktypeVARCHAR2(4)Whether this is a lock or a pin
  • DBA_DDL_LOCKS : 모든 DDL락과 DDL락을 요청하는 리스트
ColumnDatatypeNULLDescription
SESSION_IDNUMBERSession identifier
OWNERVARCHAR2(30)Owner of the lock
NAMEVARCHAR2(30)Name of the lock
TYPEVARCHAR2(40)Lock type: CURSOR, TABLE/PROCEDURE/TYPE, BODY, TRIGGER, INDEX, CLUSTER
MODE_HELDVARCHAR2(9)Lock mode: NONE, NULL, SHARE, EXCLUSIVE
MODE_REQUESTEDVARCHAR2(9)Lock request type: NONE, NULL, SHARE, EXCLUSIVE

3. 예

  • ALTER TABLE ... : library cache lock을 EXCLUSIVE 모드로 획득
  • CREATE OR REPLACE PROCEDURE ... : library cache lock을 EXCLUSIVE 모드로 획득
  • SQL문 Parsing 단계 : library cache lock을 SHARED 모드로 획득
  • SQL문 Execute 단계 : library cache lock을 NULL 모드로 획득

4. Breakable parse lock ( Oracle Concept Manual )

  • Null 모드의 library cache lock을 breakable parse lock 이라 한다.
  • 락을shared 또는 exclusive 모드로 잡고 사용한 후에 SQL Cursor 및 참조 객체에 대해 library cache lock 을 hold리스트에서 해제하지 않고 null모드로 유지한다.
  • LCO가 변경되면 null모드 락을 통해 Lock Holder를 깨우고(Break), SQL LCO를 일괄적으로 자동 뮤효화한다.

library cache pin

1. LCO를 접근하거나 변경하는 경우, LCO에 대해 획득하는 Lock
2. LCO의 실행정보를 보호, 즉 실행 과정동안 LCO의 실행 정보가 변경되는 것을 방지함
3. 예

  • SQL문 실행 단계 : library cache pin을 SHARED 모드로 획득
  • PROCEDURE 실행 단계 : library cache pin을 SHARED 모드로 획득
  • ALTER PROCEDURE...COMPILE : library cache pin을 EXCLUSIVE 모드로 획득
  • Hard Parsing 단계(실행계획 수립): library cache pin을 EXCLUSIVE 모드로 획득

library cache pin Holder 확인

1. 경합 OBJECT 확인

{code}
select session_id sid, lock_type type, lock_id1 object_name
from dba_lock_internal
where mode_requested <> 'NONE'
and mode_requested <> mode_held
and session_id in ( select sid from v$session_wait where wait_time =0 and event like 'library cache pin');
{code}

2. pin Holder 확인

{code}
select sid Holder, kglpnmod Held, kglpnreq Req, event, wait_time
from x$kglpn p, v$session s
where kglpnhdl in ( select p1raw from v$session_wait where wait_time =0 and event like 'library cache pin')
and kglpnmod <> 0
and s.saddr = p.kglpnuse;
{code}

Soft Parsing

1. Child LCO에 Lock(N)/Pin(S)획득
2. SQL이 참조하는 객체에 Lock(S)/Pin(S)획득

Hard Parsing

1. Child LCO에 Lock(N)/Pin(X)획득
2. SQL이 참조하는 객체에 Lock(S)/Pin(S)획득

Lock/Pin 두가지 Lock을 사용하는 이유

  • 자식 LCO의 동시성을 보장하여 Library Cache 영역에 대한 접근성을 최대한 높이는데 있다.

경합 예

1. Session A = Procedure 실행, Session B = Procedure 컴파일

  • Procedure 수행시에는 library cache pin을 Shared 모드로 획득(대기발생)
  • Procedure 컴파일시에는 library cache pin을 Exclusive 모드로 획득

2. Session A = Soft Parsing, Session B = Hard Parsing

  • Soft Parsing 단계에서는 library cache pin을 Shared 모드로 획득 (대기발생)
  • Hard Parsing 단계에서는 library cache pin을 Exclusive 모드로 획득
  • 동시에 발생할 경우 락 모드 호환성이 없으므로 대기 발생.
  • DDL수행 후 library cache pin 대기가 급증하는 이유도 Hard Parsing 과 관련

3. Session A = ALTER, Session B = SELECT

  • ALTER는 library cache lock을 Exclusive 모드로 획득
  • SELECT는 Parsing 단계에서는 library cache lock을 Shared 모드로 획득 (대기발생)

문서에 대하여