Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-18
제목 Sequence Cache
Sequence Cache


오라클 sequence를 사용할 때에 cache라는 옵션을 가지고 있다.

이러한 옵션을 사용할때 가끔 수자가 이어지지 않고 끊어지는 경우가 발생할 수
있는데 여기서는 어떤 상황에서 수자가 없어지며 이러한 상황을 최소화할수 있는
방법을 찾아보고자 한다.

non-cache mode 인 경우에 'nextval' 을 요구하게 되면 current value에서 increment
만큼의 값이 증가될 것이다. 예를 들어 current value는 0이고 increment는 1이며
cache가 아닐 때 'nextval'을 요구하게 되면 1이 return 될 것이다.

cache option과 같이 사용될 때 sequence에 대해서 'nextval'을 요구하게 되면
cache 되는 만큼의 값에서부터 차례대로 next 값을 가져오게 되며 cache된 값을
모두 사용하고 난 다음은 다음 caching 을 하게 된다.

만약 다음과 같이 sequence가 선언되었다고 하자.

create sequence seq increment by 1 cache 5;

NUMBER SEQUENCE CACHE
RETURNED CURRENT CURRENT
start none 0 none
1st access 1 5 1
2nd access 2 5 2
3rd access 3 5 3
4th access 4 5 4
5th access 5 5 5
6th access 6 10 6
7th access 7 10 7

cache되어 있는 값들이 절대로 없어지지 않는다고 가정하면 출력되는 결과 값들은
non-cache 의 그것과 다를 것이 없을 것이다.

그러나 sequence cache도 역시 다른 cached information과 같이 shared pool 에 저장된다.
이것은 다른 shared pool에 있는 procedure처럼 자주 access 되지 않으면 age out될 수
있음을 의미하기도 한다. 또한 shutdown 시에는 cache에 있는 모든 것을 잃어버리게
된다. 여기서 주로 shutdown에 의해 sequence의 번호가 skip 될수 있으므로 skip되어서는
안되는 번호를 가진 응용프로그램에서는 non-cached sequence 를 사용해야 한다.
다음에는 cache age out과 shutdown이후에 sequence number의 변화를 예를 들어 설명한다.

NUMBER SEQUENCE CACHE
RETURNED CURRENT CURRENT
start none 0 none
1st access 1 5 1
2nd access 2 5 2
cache aged out
3rd access 5 10 5
4th access 6 10 6
shutdown
5th access 10 15 10
6th access 11 15 11
7th access 12 15 12

aging 문제를 해결하기 위해서 7.3 이후에서 부터는 dbms_shared_pool 이라는 package 를
이용해서 shared pool내에 다음과 같이 고정시켜 놓을수 있다.

dbms_shared_pool.keep('seq','Q');
Comment
등록된 코멘트가 없습니다.