메뉴 건너뛰기

bysql.net

1. Library Cache Lock

2010.07.17 23:42

balto 조회 수:12800

라이브러리 캐시 구조

      librarycache.jpg


라이브러리 캐시 Lock

- 라이브러리 캐시 Lock은 라이브러리 캐시 오브젝트(LCO)에 대한 핸들을 보호한다.

- Lock의 모드

Shared : 읽기작업

Exclusive : 생성 또는 변경작업

Null : Lock을 장시간 유지할 때, 대기는 발생시키지 않고 오브젝트간 의존성 관리

- Lock 모드간 호환성

Lock 모드

Null

Shared

Exclusive

Null

O

O

O

Shared

O

O

X

Exclusive

O

X

X

- (실험) 1번 때문에 2번이 대기하는 것을 3번으로 관찰하였다.

(프로그램)


1

create table t( id number, name char(10));

insert into t

select rownum, lpad( rownum, 10, '0' ) from dual

connect by level <= 1000000;

commit;

alter table t modify name char(20); /* 시간이 걸리는 작업 */

2

select sid from v$mystat where rownum = 1;

select count(*) from t; /* 대기 상태 - library cache lock */

3

select event, wait_time, seconds_in_wait, state,

p1text || '->' || p1 || ' , ' || p2text || '->' || p2

||' , '||p3text||'->' ||p3 param

from v$session_wait where sid = '141';


(결과)

EVENT WAIT_TIME SECOMDS IN_WAIT STATE PARAM

--------------------------------------------------

library cache lock 0 11 WAITING ...


- NULL 모드는 Lock을 장시간 유지할 때 사용, 커서는 항상 널 모드 사용, 언제든지 요청이 있으면 break 된다.

- 스키마 오브젝트는 변경되거나 Drop 되면 커서를 참조하는 LOC는 무효화되어야 한다. 커서는 자기가 참조하는 객체에 대하여 Parse Lock을 보유한다. 객체가 변경되면 Parse Lock 해제되고 커서는 무효화된다.


fig7-1.jpg


 

라이브러리 캐시 Pin

- 라이브러리 캐시 Pin은 LCO 내용이 담긴 힙영역을 보호한다.

- 프로세스는 LCO에 대한 Pin을 얻어서 읽고, 변경, 실행한다.

   Null Lock이 해제된 상태이면 Pin 연산은 실패하게 된다.

   Lock을 얻고 Pin하려는 순간 힙의 내용이 캐시에서 밀려나면 다시 적재해야한다.

- 하드파싱을 하게 되면 SQL 트레이스에서 다음 항목을 발견할 수 있다

Misses in library cache during parse: 1

- library cache miss가 Execute 단계에서 나타날 수도 있다. 이유는 실행단계에서 LCO 힙에서 밀려나 있을 수 있기 때문이다.

Misses in library cache during parse: 1

Misses in library cache during execute: 1

- Pin의 모드

   Share (읽기 작업)

   Exclusive (Shared 모드에서 에러와 보안 체크한 후 변경작업시 Exclusive 모드)


라이브러리 캐시 Lock과 Pin, 두 개의 직렬화 장치를 따로 두는 이유

- LCO 타입에 따른 Lock과 Pin

LCO 타입

LOCK

Pin

테이블, 인덱스, 클러스터

생성, 변경시 Exclusive

읽을때 Share

변경할떄 Exclusive

읽을때 Share

함수, 프로시저, 패키지

컴파일때 Exclusive

읽을때 Share

실행할 때 Null

컴파일할 때 Share

실행할 때 Share

SQL 커서

항상 Null

커서찾을때 Share

하드파싱할 때 Exclusive


- 라이브러리 캐시 Lock과 Pin 메커니즘 예 1

DEPT 테이블 변경 -> get_dname() 함수에 대한 Parse Lock 해제 -> select 문 해제

-> get_dname() 함수 컴파일 작업은 진행 가능...

       fig7-2.jpg
 

- 라이브러리 캐시 Lock과 Pin 메커니즘 예 2

select 문 실행 중 -> Shared 모드로 pin 설정 -> get_dname() 함수도 Shared 모드로 pin 유지 -> DEPT 테이블 변경

-> Parse Lock 모두 해제 -> select 문 실행 중이므로 pin은 유지 -> get_dname() 컴파일하려면 library cache pin 대기 이벤트 발생 


       fig7-3.jpg 



- 하나의 LCO에 대해서 Lock과 Pin 2개의 직렬화 장치를 둔다.

  LCO 핸들은 영구적인 Fixed Array 영역에 할당되고 LCO는 힙영역에 할당된다.

  LCO의 정합성은 Pin으로 보장되고, 별도로 Lock을 두어 동시성을 높인다.