본문 바로가기
Oracle

[Oracle] 시퀀스 채번 증가 이상 - Cache

by 상후 2022. 1. 29.
728x90
반응형

 

오라클 시퀀스 NEXTVAL(채번)  시 증가 값 이상할 경우

 

신규 테이블의 데이터 저장 모니터링 중 데이터에 저장되는 시퀀스의 값이 1씩 정상적으로 증가하지 않았습니다.

개발DB에서 테스트할 때는 정상적으로 1씩 증가함을 확인하였는데, 운영DB에서는 다르게 동작하고 있었던 것인데

이유는 아래와 같습니다.

 

발생 원인
1. 개발환경에서는 시퀀스 생성 시 캐시(Cache)를 nocache로 지정하여 생성 후 테스트를 하였습니다.
2. 운영환경에서는 DBA가 시퀀스 생성 시 시퀀스 캐시를 20으로 지정하여 생성하였습니다.

 

그렇다면 DBA는 시퀀스 캐시를 왜 지정해 주었고, 시퀀스 캐시가 하는 역할은 무엇일까?
간단히 정리하면 속도를 위해 사용합니다.
시퀀스 채번을 요청할 때마다 데이터 사전에 접근하는 게 아니라
캐시로 지정된 크기만큼 캐시 메모리(Library Cache)에 올려둔 뒤 사용하기 때문이라고 합니다.

참고 자료 : https://velog.io/@kimju0913/ORACLE-Sequence-Cache

 

속도에 도움도 되는 캐시인데 왜 이상이 생긴 거지?
[캐시를 사용하면 메모리 즉 Library Cache에 시퀀스 값을 올려두는 방식을 의미한다. ]

1. DB가 비정상적으로 종료되었다. - 종료될 때 캐시 메모리(Library Cache)가 소멸되므로
2. 사용빈도가 적어 캐시 메모리(Library Cache)에서 삭제되었다. (우선순위 밀림)

내 경우에는 DB가 정상적으로 종료된 적은 없었고,
새로 개발된 프로세스이고 아직 사용빈도가 적어 2번이 원인임으로 판단할 수 있었다.

참고자료 : https://doughman.tistory.com/11

 

결론
오라클의 시퀀스를 생성할 때는 캐시 생성 여부를 잘 판단해야 한다.

생성되는 시퀀스 값이 비즈니스 로직에서 중요한 역할을 하고, 반드시 1씩 채번이 되어야만 한다면 nocache로 생성
시퀀스는 로직 상 중요하지 않고 값의 PK용도로만 사용하거나 한다면 cache를 지정하여 속도에 도움을 줄 수 도있다.
 
나의 경우에는 비즈니스 로직에서 시퀀스가 중요한 역할을 하지는 않았기 때문에 캐시를 유지하기로 결정했다.
앞으로 시퀀스 생성 시에 비즈니스 로직을 고려하여 캐시 생성 여부를 잘 판단하자.

++ 추가
시퀀스 생성 시 CACHE/  NOCACHE 모두 생략하면 데이터베이스는 기본적으로 20개의 시퀀스 번호를 캐시한다고 하니 주의합시다.

 

https://docs.oracle.com/cd/B12037_01/server.101/b10759/statements_6014.htm

 

 

 

 

모르는게 너무 많고, 실수도 많이 한다.

같은 실수를 반복하지 않게 노력하고, 실패와 경험을 통해 더 배우려고 해 보자.

 

 

 

728x90
반응형

댓글