[오라클 시퀀스] 시퀀스 cache size에 설정할 때 한번 생각하자
아는 것이 힘이다.가 아니라
요즘은 잘 찾아내는 것이 힘이다는 생각이 드네요.
이번에 오라클 시퀀스 Cache Size를 일괄적용한 적이 있었네요.
근데 시퀀스 체번이 1000씩 늘어나는 것 확인
꼭 1씩만 증가되어야 하는 로직이 였는데 문제가 발생이 되어서 오라클포럼에서 확인
원본 링크에여 https://kr.forums.oracle.com/forums/thread.jspa?threadID=463133
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');
Reference Documents
오라클 10g에서는 어떻게 변화가 되었는지 모르지만....
non-cached 옵션이 있는 것을 보면, 먼가가 있겠죠 ....
(.. )( ..) 스크랩은 자유
그러나 퍼간다는 매너는 필수 ㅇ.ㅇ
매너 없는 사람되지 맙시다!! ㅋ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ