우리는 오라클 Sequence를
중요한 문서나 회원에 고유번호로 활용하는 경우가 종종 있다.
당연히 1부터 빈틈없이 자동으로 증가해줄것이라고 믿는다.
하지만 퍼포먼스를 위해 Sequence의 Cache를 사용했다면 그렇지 않을 수 있다.
Sequence의 Cache는...
원하는 숫자 만큼 미리 만들어 Shared Pool의 Library Cache에 상주 시키는 기능이다.
다시말해,
Cache가 저장된 수 만큼 Disk I/O가 발생하지 않는 장점도 있고
반면에 Library Cache가 날아간다면 Sequence Cache도 날아가게 된는 단점도 있다.
만약 Cache를 50으로 했다면 1~50까지 읽었가는(Nextval) 동안에는 Library Cache에서 읽어간다.
51번째를 요청할때 다시 50이 증가된 51~100까지 다시 Library Cache에 저장하는 것이다.
Disk I/O가 2번 밖에 발생하지 않았다.^^;;; 좋은 기능임엔 틀림없다.
하지만 오류 아닌 오류가 아래와 같이 있으므로 유의해서 사용해야 한다.
-
DB가 비정상적으로 종료가 되었거나 (PMON이 죽거나, shutdown abort를 사용했을경우)
-
Library Cache에서 우선순위 경합에 밀려 cache aged out 되는 경우다.
다시말해, 사용 빈도가 적어 메모리에서 삭제되는 경우를 말한다.^^;
Cache 50에 Current값이 1이라고 할지라도....
위와 같은 현상이 발생한다면 다음 시퀀스는 51이 된다.
(참고: http://kr.forums.oracle.com/forums/thread.jspa?threadID=463133)
해결 방법은 2가지다.
- Cache를 사용하지 않는 것.
- dbms_shared_pool package를 이용해 Library Cache에 항상 상주하도록 강제설정하는 방법이다.
무엇보단 근본적인 방법인 1번을 추천하고 싶다. 특별한 경우가 아니면 Cache를 사용하지 말자....^^;;