02.Oracle/DataBase2013. 12. 30. 11:04
반응형

우리는 오라클 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번 밖에 발생하지 않았다.^^;;; 좋은 기능임엔 틀림없다.

 

하지만 오류 아닌 오류가 아래와 같이 있으므로 유의해서 사용해야 한다.

  1. DB가 비정상적으로 종료가 되었거나 (PMON이 죽거나, shutdown abort를 사용했을경우)

  2. Library Cache에서 우선순위 경합에 밀려 cache aged out 되는 경우다.
    다시말해, 사용 빈도가 적어 메모리에서 삭제되는 경우를 말한다.^^;

Cache 50에 Current값이 1이라고 할지라도....

위와 같은 현상이 발생한다면 다음 시퀀스는 51이 된다.

(참고: http://kr.forums.oracle.com/forums/thread.jspa?threadID=463133)

 

 

해결 방법은 2가지다.

  1. Cache를 사용하지 않는 것.
  2. dbms_shared_pool package를 이용해 Library Cache에 항상 상주하도록 강제설정하는 방법이다.

무엇보단 근본적인 방법인 1번을 추천하고 싶다. 특별한 경우가 아니면 Cache를 사용하지 말자....^^;;

 

출처 : http://blog.naver.com/PostView.nhn?blogId=xacti&logNo=80109572891&parentCategoryNo=3&viewDate=&currentPage=1&listtype=0

Posted by 1010