[ORACLE] Sequence Cache

김주경·2021년 7월 19일
1
post-custom-banner

평소 프로젝트는 mysql, mariaDB로 진행되는 것이 대부분이기에, 가끔 오라클을 쓰는 프로젝트를 마주하면 최소 수분 수시간은 당황하고 헤매곤 한다. 아니나 다를까 오라클로 간단한 시스템을 만드는 일이 주어졌는데 시퀀스를 불러오고 입력하는데에서 부터 엄청 헷갈렸다. auto increment가 없었다는 사실에 충격을 먹었고, 시퀀스를 따로 만들어줘야한다는걸 까먹은 내 스스로에게 충격을 먹었다.

무튼 일을 하다 보니 뭔가 좀 이상했다. 지금 보고 있는 시퀀스가 80몇번 이었는데 DB를 확인하기 귀찮아 대충 숫자 몇 개를 뺀 값으로 로직을 돌렸는데 없는 값이 나오는 것이다... 엥 나는 분명히 삭제를 한 적이 없는데... 순간 로직을 잘못짠줄 알고 면밀히 살폈으나 아무런 이상이 없었다... 결국 DB를 들여다 봤는데 시퀀스가 1,2,3,4,21,22,23,41,42 같은 패턴으로 지정이 되어있었음....
이게 뭐지 싶어서 시퀀스를 보니 cache에 20이 적혀있는것을 보았다. 거기서 또 한 번 이 캐시가 뭐였더라.... 하는 생각이 듦....

아무리 금붕어 기억력이라지만 이걸 그 새 잊었다는 것이 충격적이어서 한번 정리해 본다.

Sequence

시퀀스는 Database에 고유한 정수형 값을 붙이기 위한 객체다. PK의 역할을 한다고 보면 되는데, 나의 경우 mysql이나 mariaDB에서 사용할 때, 시퀀스 컬럼을 하나 만들어 auto_increment를 붙여 사용하곤 했다. 오라클의 경우 이러한 시퀀스를 따로 관리할 수 있다.

Cache

오라클에서 시퀀스를 생성하면 증가값, 시작값, 최대값 등을 설정할 수 있는데, 이 때 캐시의 크기 역시 설정 가능하다. 흔히들 속도 향상을 위해 캐시를 사용한다고 한다. 근데 뭘 근거로 속도향상이 된다고 말하는걸까...

오라클은 DDL 명령이 실행될 때 마다 데이터사전(oracle data dictionary)에 접근한다. 예를 들어서 우리가 1000개의 레코드를 삽입한다고 가정했을때, 캐시를 20으로 해두면 oracle data dictionary에 50번 접근해야하지만 200으로 해둔다면 5번이면 된다는 것이다.

캐시를 사용하면 Shared Pool에 내가 지정한 만큼의 시퀀스가 존재하게 된다. 이 때 Library Cache에 저장이 되는데 시퀀스에 캐시를 지정해두면 그 구간동안은 Library Cache에 저장되는 것이다. 기본 값인 20으로 캐시를 지정해두었으면 1~20번까지의 작업동안에는 Library Cache에 저장하고 21번 부터는 새로이 40번까지 Library Cache에 저장해두는 것이다. 이렇게 66번까지의 작업을 했다고 하면 사실상 Disk I/O는 4번이 발생한 것이다.

아마도 이러한 점을 근거로 캐시가 속도향상에 도움을 주는 것 같다고 하는 듯 하다. (내 두뇌와 실력으로는 이렇게 이해하는 것이 최선이다...)

좋키많 한대 외 않써?

속도 향상에 도움이 되니 묻지도 따지지도 말고 무지성으로 그냥 쓰면 되는 것 아닐까? 그냥 쓰면 될리가 있겠나.
캐시의 특성상 Library Cache에 저장해두고 쓰기 때문에 DB가 불안정하게 갑자기 종료된다던지, 자주쓰지 않아 Library Cache 우선순위에서 밀리게 되믄 갑자기 짬뿌하게 된다. 내가 한 3번째 데이터를 정리하고 있다가 aged out 되면 갑자기 1번 2번 3번, 51번, 101번 이런식으로 시퀀스가 급증하게 된다는 이야기다.

마땅한 예시가 잘 생각나진 않지만, 내가 무튼 이놈의 시퀀스를 꼭 1씩 차근차근 쌓아둬야만 하는 상황이고, 이를 통해 어떤 로직을 짠다던지 데이터를 추출한다던지 하는 상황이라면 꽤나 심각한 상황에 도래하는 것이다.

마무으리

뻔한 마무리지만 뭐가 됐든 알고 써야한다. 시퀀스를 무조건 1씩 쌓아야하거나, 순차적으로 정렬을 해야만 하는 경우가 아니라면 캐시 위에 올려두는 것이 좋다고 하는 것 같다. 안정적으로 이쁜 시퀀스를 얻을수는 있으나, 커뮤니티 게시판 같이 계속 INSERT가 들어오는 상황이라면 부하가 걸리기 때문이다. 구글링을 하다보니 캐시를 쓰지 않은 경우와 20, 100, 1000 단위로 10만건의 데이터를 처리한 실험결과를 봤는데, 성능차이가 확실히 있다. 급하게 정리하느라 엉망이지만, 추후에 좀 더 공부하고 보충해야겠다.

참고 및 출처
1) https://doughman.tistory.com/11
2) https://blog.naver.com/xacti/80109572891
3) https://support.esri.com/en/technical-article/000004476
4) https://stackoverflow.com/questions/24298868/sequence-cache-and-performance

profile
안냐세온
post-custom-banner

0개의 댓글