메뉴 건너뛰기

bysql.net

3. 라이브러리 캐시 구조

2010.06.28 00:15

balto 조회 수:9849

- 라이브러리 캐시 : Shared Pool에 위치하며 SQL 공유 커서 및 데이터베이스 오브젝트에 대한 정보를 관리한다. PL/SQL Area(프로시저, 함수, 패키지, 트리거)도 포함한다.

- (정의) 실행가능 LCO : 실행가능한 SQL 커서나 PL/SQL 오브젝트

- (정의) 오브젝트 LCO : 테이블, 인덱스, 클러스터 같은 데이터베이스 오브젝트(데이터 딕셔너리 캐시에도 저장되어 있지만 LCO 간의 의존성을 관리하기 위하여 저장)


라이브러리 캐시의 내용

(실험) 라이브러리 캐시에 저장된 오브젝트 보기

select namespace, gets, pins, reloads, invalidations

from v$librarycache;

NAMESPACE

GETS

PINS

RELOADS

INVALIDATIONS

SQL AREA

6321

93511

905

99

TABLE/PROCEDURE

8444

19849

1168

0

BODY

370

535

48

0

TRIGGER

232

382

18

0

INDEX

288

1767

24

0

CLUSTER

266

708

8

0

OBJECT

0

0

0

0

PIPE

0

0

0

0

JAVA SOURCE

0

0

0

0

JAVA RESOURCE

0

0

0

0

JAVA DATA

0

0

0

0

(설명) v$librarycache에 저장되는 내용

- Stored Object : 영구적으로 저장되는 테이블, 인덱스, 클러스터, 뷰, 트리거, 패키지 등

- Transient Object : 일시적으로 저장되는 커서, 이름없는 pl/sql 등


라이브러리 캐시 내의 shares pool latch 의 내용

(실험) 라이브러리 캐시 7개까지 latch 사용

select child#, gets, misses, sleeps, immediate_gets, immediate_misses

from v$latch_children

where name='shared pool'

order by child#;

CHILD#

GETS

MISSES

SLEEPS

IMMEDIATE_GETS

IMMEDIATE_MISSES

1

278105

333

37

0

0

2

11

0

0

0

0

3

11

0

0

0

0

4

11

0

0

0

0

5

11

0

0

0

0

6

11

0

0

0

0

7

11

0

0

0

0


라이브러리 캐시 관리 구조

- 라이브러리 캐시는 해시 구조로 관리된다.

- LCO 핸들이 체인으로 연결되어 있고 핸들을 통해 LCO를 찾아간다.

fig4-6.jpg


- LCO emp, sql 문 등이 라이브러리 캐시에 적재되어 있음,

- sql 문이 같은데 공유하지 못하는 경우 child 커서를 만든다.

- library cache latch를 먼저 획득하여 접근한다.

select child#, gets, misses, sleeps, immediate_gets, immediate_misses

from v$latch_children

where name='library cache'

order by child#;

- LCO에 대한 라이브러리 캐시 LOCK과 라이브러리 캐시 pin을 사용한다.

LOC 접근시 : 핸들에 대한 Lock 획득 -> 힙에 대한 pin 획득 및 pin 걸기

- shared pool 래치와 library cache 래치 경합은 soft/hard 파싱이 심하게 일어날 EO 발생하고, library cache lock과 librar y cache pin 대기 이벤트는 SQL 수행 중 DDL을 날릴때 사용한다. 트랜잭션이 활발할 때 DDL 문을 수행하면 라이브러리 캐시에 부하가 유발된다.


라이브러리 캐시 최적화를 위한 튜닝 기법

(1) 커서를 공유할 수 있도록 SQL을 작성한다. - 바인드 변수에 주의한다.

(2) 세션 커서 해싱 기능을 이용하여 라이브러리 캐시에서 SQL을 찾는 비용을 줄인다.

(3) 애플리케이션 커서 캐싱을 이용해 Parse Call 발생량을 줄인다.