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 사이의 캐시값을 가지며 값의 차이가 그리 크므로, 두 노드가 다른 인덱스 리프 블록을 변경하게됨
- 따라서 인덱스 리프 블록에 대한 경합이 발생할 확률이 적어짐
문서에 대하여
- 최초작성자 : 임주영
- 최초작성일 : 2010년 10월 08일
- 이 문서는 오라클클럽 코어 오라클 데이터베이스 스터디 모임에서 작성하였습니다.
- {*}이 문서의 내용은 (주)엑셈에서 출간한 'PRACTICAL OWI IN ORACLE 10G'를 참고하였습니다.*