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 리스트
Column | Datatype | NULL | Description |
---|
kgllkuse | RAW(4) | | Address of the user session that holds the lock or pin |
kgllkhdl | RAW(4) | | Address of the handle for the KGL object |
kgllkmod | NUMBER | | Current mode of the lock or pin |
kgllkreq | NUMBER | | Mode in which the lock or pin was requested |
kgllktype | VARCHAR2(4) | | Whether this is a lock or a pin |
- DBA_DDL_LOCKS : 모든 DDL락과 DDL락을 요청하는 리스트
Column | Datatype | NULL | Description |
---|
SESSION_ID | NUMBER | | Session identifier |
OWNER | VARCHAR2(30) | | Owner of the lock |
NAME | VARCHAR2(30) | | Name of the lock |
TYPE | VARCHAR2(40) | | Lock type: CURSOR, TABLE/PROCEDURE/TYPE, BODY, TRIGGER, INDEX, CLUSTER |
MODE_HELD | VARCHAR2(9) | | Lock mode: NONE, NULL, SHARE, EXCLUSIVE |
MODE_REQUESTED | VARCHAR2(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 모드로 획득 (대기발생)
문서에 대하여
- 최초작성자 : ~kwlee55
- 최초작성일 : 2010년 09월 07일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)엑셈에서 출간한 'PRACTICAL OWI IN ORACLE 10G'와 'wiki.ex-em.com'를 참고하였습니다.*