TECH
QUESTION
자주하는 질문답변 입니다.
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 | |||
---|---|---|---|
등록된 코멘트가 없습니다. |