#공유 풀 락 / 데이터 딕셔너리 락

공유 풀 락 / 데이터 딕셔너리 락의 개념

  • 공유 풀 자원을 관리하는 락을 데이터 딕셔너리 락(Data Dictionary Lock)으로 분류
    • 로우 캐시 락
    • 라이브러리 캐시 락
    • 라이브러리 캐시 핀
  • 데이터 딕셔너리는 데이터베이스의 오브젝트 및 기타 자원의 메타 정보 저장 되어 있으며 필요시 버퍼 캐시 → 로우 캐시(공유 풀) → 라이브러리 캐시 저장 됨

로우 캐시 락 : 딕셔너리 정보를 저장하는 로우 캐시 영역의 동시성 관리

딕셔너리 정보를 이용하는 메커니즘

1. HR.사원번호 시퀀스 사용 요청
2. HR.사원번호 정보 블록을 버퍼캐시로 복사
3. 로우 캐시에 정보를 복사 하기 위해 row cache object 렛치 획득 및 로우 캐시 락 획득 (동시성 관리)
4. 버퍼캐시에서 필요한 딕셔너리 정보를 행 단위로 로우 캐시로 복사
5. 필요한 오브젝트 정보를 로우 캐시에서 라이브러리 캐시로 복사

로우 캐시 락의 종류
  • 공유 락(S) - 로우 캐시에 저장된 오브젝트를 읽을 대 적용. 모드는 3
  • 배타적 락(X) - 로우 캐시에 저장된 오브젝트를 변경할 때 적용. 모드는 5
로우 캐시 락 관련 동적 뷰
동적 뷰정보
{code:noneborderStyle=solid}V$ROWCACHE{code}
  • CACHE# - 로우 캐시 ID
  • PARAMETER - 로우 캐시 이름
  • GETS - 로우 캐시 요청 횟수
  • GETMISSES - 로우 캐시 요청 시 획득 실패 횟수
  • MODIFICATIONS - 로우 캐시 수정 횟수
  • FLUSHES - 로우 캐시 공간 부족으로 디스크로 내려쓴 횟수
{code:noneborderStyle=solid}V$ROWCACHE_PARENT{code}
  • CACHE# - 로우 캐시 ID
  • CACHE_NAME - 로우 캐시 이름
  • LOCK_MODE - 적용하고 있는 락 모드 (0: 락 적용 안됨, 3: 공유 모드, 5: 배타적 모드, 10: 락 적용 실패)
  • LOCK_REQUEST - 적용하기 위해 대기하고 있는 락 모드
  • SADDR - 세션 정보, V$SESSION.SADDR 컬럼과 조인 가능

라이브러리 캐시 락과 라이브러리 캐시 핀

라이브러리 캐시 락/핀이 적용되는 과정

1. 사용자가 select 문 수행
2. library cache 렛치 획득
3. 해시 알고리즘을 적용하여 필요한 데이터가 담긴 버킷을 선택한다.
4. library cache lock 렛치 획득
5. 오브젝트 핸들에 라이브러리 캐시 락을 적용한다.
6. library cache pin 렛치를 획득한다.
7. 힙에 라이브러리 캐시 핀을 적용한다.

라이브러리 캐시 사용은 오브젝트 핸들을 통해서

1. 세션1) EXEC TEST_PROC(); => 오브젝트 핸들의 락 소유자에 공유(S) 락 모드로 등록
2. 세션2) CREATE OR REPLACE TEST_PROC() ... => 오브젝트 핸들의 락 대기자에 배타적(X) 락 모드로 대기

라이브러리 캐시 락 종류
  • 널 락(Null) - SQL 파스 후 적용. 모드는 0 (DDL 발생 시 SQL 및 PL/SQL 의 파스 정모 무효화 시 활용)
  • 공유 락(S) - 라이브러리 캐시에 저장된 오브젝트를 읽을 때 적용. 모드는 2
  • 배타적 락(X) - 라이브러리 캐시에 저장된 오브젝트를 변경할 때 적용. 모드는 3
라이브러리 캐시 락 모드간 적용 호환성
구분 (적용된락)
(요청락)
락 없음널 락공유 락배타적 락
(같은세션)널 락가능가능가능가능
(같은세션)공유 락가능가능가능가능
(같은세션)배타적락가능가능불가능(X)가능
(다른세션)널 락가능가능가능가능
(다른세션)공유 락가능가능가능불가능(X)
(다른세션)배타적락가능가능불가능(X)불가능(X)
라이브러리 캐시 핀 종류
  • 공유 핀(S) - 힙에 저장된 데이터를 읽을 대 적용, 모드는 2.
  • 배타적 핀(X) - 힙에 저장된 데이터를 변경할 때 적용, 모드는 3.
라이브러리 캐시 핀 적용 호환성
구분 (적용된핀)
(요청핀)
공유 핀배타적 핀
공유 핀가능불가능(X)
배타적 핀불가능(X)불가능(X)
라이브러리 캐시 핀 이벤트 파라미터 의미
  • P1 - 오브젝트 핸들이 위치한 메모리 주소
  • P2 - 라이브러리 캐시 핀이 위치한 메모리 주소
  • P3 - (100 X 요청된 락 모드) + 네임스페이스 번호
V$LIBRARYCACHE (라이브러리 캐시 사용 통계 정보)
주요 컬럼설명
NAMESPACE네임스페이스 이름
GETS오브젝트 핸들에 대한 락 적용을 요청한 횟수
GETHITS오브젝트 핸들에 대한 락을 적용한 횟수
GETHITRATIO오브젝트 핸들에 락 적용 요청을 성공한 비율, GETHITS/GETS
PINS힙 오브젝트의 핀 적용을 요청한 횟수
PINHITS힙 오브젝트의 핀을 적용한 횟수
PINHITSRATIO힙 오브젝트에 핀 적용 성공 비율, PINHITS/PINS, 라이브러리 캐시 적중률을 나타낼 때 사용
RELOADS디스크로 내려쓰였다가 다시 라이브러리 캐시에 저장된 횟수
INVALIDATIONS오브젝트 정보가 변경되어서 오브젝트 관련 정보가 무효화된 횟수

뮤텍스

  • 10g 부터는 라이브러리 캐시 동시성을 관리할 때 라이브러리 락/핀을 적용하기 위해 렛치 대신 뮤텍스(MUTEX)를 사용
  • MUTual EXclusion object : 상호 배타적 오브젝트 / 렛치와 비슷하지만 더 가벼움
  • library cache load lock 렛치를 제외한 라이브러리 캐시 관련 렛치를 대체함