본문 바로가기

DB

[ORACLE] Sequence 증가 이상 - Cache (Last Number와 Currval 값 차이)

 

시퀀스가 꼬여서 순서가 이상해진 적이 있는데 nextval로 increment만큼 증가시킨 값을 가져오니 그럴 일이 없었다..

확인해보니 currval와 sequence의 last number 값이 20정도 차이가 났는데 해당 sequence의 'Cache Size'가 20이었다.

의심가는 게 캐시밖에 없어서 일단 시퀀스를 다시 맞추고(이 땐 두 값이 일치했음) 다음날 다시 커넥하여 확인해보니 또 20이 ㅋㅋㅋ 벌어져있는 것이다. 확실히 캐시 때문인 것 같아 검색 ㄱㄱ

 

cache 옵션을 사용하면 속도를 증가시키기 위해 sequence 번호를 한 번에 여러 개씩 메모리에 올려놓고 작업을 한다. 이것을 사용하면 매번 sequence 번호를 생성하는 것보다 빠르기 때문이다. 이러한 경우에 DB를 중지시키거나 전원이 off 되는 경우에 메모리에 있던 번호가 삭제되기 때문에 이러한 증상이 발생된다. 즉 cache 옵션이 20개씩 시퀀스 번호를 생성하도록 설정되어 있다면 한번에 1부터 20까지 시퀀스 번호를 생성한다. 이 상태에서 DB를 중지하고 재시작 시키면 메모리에 있던 20번까지의 시퀀스가 삭제되고 21번부터 40번까지 메모리에 시퀀스 번호가 저장되기 때문에 이런 경우에 1, 21, 41로 시퀀스 번호가 증가될 수 있다.

출처: https://denodo1.tistory.com/273 [dBack]

Sequence의 Cache는 원하는 숫자 만큼 미리 만들어 Shared Pool의 Library Cache에 상주 시키는 기능이다.
 
다시말해,
Cache가 저장된 수 만큼 Disk I/O가 발생하지 않는 장점도 있고
반면에 Library Cache가 날아간다면 Sequence Cache도 날아가게 된는 단점도 있다.

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

Library Cache에서 우선순위 경합에 밀려 cache aged out 되는 경우다. 다시말해, 사용 빈도가 적어 메모리에서 삭제되는 경우를 말한다.
(참고: http://kr.forums.oracle.com/forums/thread.jspa?threadID=463133)
 
해결 방법은 2가지다.

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

출처 : http://blog.naver.com/xacti/80109572891

 

내 문제의 경우 굉장히 빠른 속도를 요구하는 것도 아니고 안정된(?) 시퀀스가 더 중요해서 NOCACHE해뒀다.

+DBA분이 그렇게 하면 느리다고 캐시값을 늘리는 것으로 마무리 했다. 그런 현상은 RAC 환경에서만 발생한다고.. 어렵군