Sequence Cache속성

  • CACHE속성
    • NOCAHCE
    • CACHE + NOOREDER
    • CACHE + ORDER
  • 각 속성 유형마다 고유의 성능 문제 존재
  • enq:SQ - contention 참조

Sequence Cache속성별 발생 Event

NOCACHE

  • nocache속성인 경우, 인스턴스 친화도는 0임
  • 로컬자원은 존재하지 않으며, 시퀀스의 nextval를 호출할 때마다 row cache lock으로 동기화하여야 함

CACHE+NOORDER

  • 2노드의 RAC에서 cache 속성 100의 시퀀스를 사용한다면,
    • 노드A에서 1~100사이 로컬 캐시 할당되고
    • 노드B에서 101~200사이 로컬 캐시 할당됨
  • 로컬캐시가 모두 소진되면, 로컬캐시가 할당될 때까지 SQ락이 대기함
  • 로컬캐시를 모두 소진하기 전까지는 nextval을 호출시 동기화 작업이 불필요하며 시퀀스 캐시 크기가 클 수록, 인스턴스 친화도가 좋아짐

CACHE+ORDER

  • 2노드의 RAC에서 cache 100 + order속성의 시퀀스를 사용하면,
    • 노드A와 노드B 모두 1~100사이의 로컬캐시 집합을 사용함
  • Nextval을 호출 할 때마다 SV락을 이용한 동기화가 필요하며, 이때 DFS lock handle을 대기함
  • 10gR2부터 DFS lock handle 이벤트는 placeholder이벤트이고, events in waitclass other 라는 fixed-up이벤트로 기록됨

h2.Sequence Cache속성 구현 Guide

  • NOCACHE는 사용하지 말아야
  • CACHE크기는 사용이 빈번할 수록 크게
    • SQ Lock과 SV Lock경합 해소
    • Index Block의 Global경합 해소
  • ORDER속성은 꼭 필요한 경우에만 사용

h2.Sequence와 Index Block경합
h3.Cache=20인 경우

  • Instance간에 같은 Leaf Block에 대한 경합 발생
  • 예제
    • 시퀀스를 사용하여 기본키(pk-uk)를 생성한다면?
    • 캐시 크기 20의 시퀀스를 사용하는 경우
    • 노드 A는 1~20, 노드 B는 21~40 사이의 캐시값을 가지며 값의 차이가 그리 크지 않으므로, 두 노드가 동일 인덱스 리프 블록을 변경하게되며, 블록 경합이 유발됨
    • 인덱스 리프 블록 경합으로 인하여 buffer busy waits또는 TX-index contention이 발생
      h3.Cache=10000인 경우
  • Instance간에 서로 다른 Leaf Block을 사용
  • 예제
    • 시퀀스를 사용하여 기본키(pk-uk)를 생성한다면?
    • 캐시 크기 10000의 시퀀스를 사용하는 경우
    • 노드 A는 1~10000, 노드 B는 10001~20000 사이의 캐시값을 가지며 값의 차이가 그리 크므로, 두 노드가 다른 인덱스 리프 블록을 변경하게됨
    • 따라서 인덱스 리프 블록에 대한 경합이 발생할 확률이 적어짐

문서에 대하여