Aurora PostgreSQL의 시퀀스에 대해

Aurora PostgreSQL의 시퀀스에 대해

PostgreSQL의 시퀀스와 Aurora PostgreSQL의 시퀀스에 대해 알아보는 글입니다.
Clock Icon2024.08.25

안녕하세요 클래스메소드의 이수재입니다.
이번에 Aurora PostgreSQL에 대해 검토하면서 시퀀스 이용에 대해 조사할 일이 있었습니다.
공부 겸 조사한 내용을 공유하고자 합니다.

결론부터

시퀀스는 중간중간 값이 스킵 될 수 있습니다.
대부분의 RDBMS에서 시퀀스와 같은 오브젝트(mysql의 auto_increase 등)은 고유성은 보장하지만 순차적 증가는 반드시 보장되는 오브젝트가 아닙니다.

RDBMS 자체의 사양과 더불어 Aurora PostgreSQL은 시퀀스를 버퍼 캐시에 저장하기 때문에 일관된 증가는 더욱 보장할 수 없습니다.

시퀀스란?

CREATE SEQUENCE 명령은 일련번호 생성기인 시퀀스를 만든다. 이 작업은 내부적으로 지정한 이름으로 된 단일 로우 특수 테이블을 만들고, 그 로우 값을 초기화하는 작업을 한다. - 공식 문서

단일 테이블에서 순차적이고 고유한 일련 번호입니다.
CREATE SEQUENCE 명령을 실행하여 생성하며 매개변수를 추가하여 설정을 바꾸는 것도 가능합니다.

시퀀스 단독으로는 값이 증가하도록 설정할 수 없어서 nextval 등의 함수와 같이 사용하는 경우가 많습니다.
시퀀스 사용법 자체에 대해서는 다음 블로그가 쉽게 이해되어서 공유드립니다.

보통 순차적으로 증가하고 고유한 ID가 필요한 경우 시퀀스 사용을 검토하는 경우가 많습니다.

PosgreSQL의 시퀀스에 대한 주의점

다만 시퀀스를 사용할 때는 완전히 순차적인 증가를 보장하지 않는다는 것에 주의해야합니다.
정확히는 시퀀스를 사용할 때 함께 쓰는 nextvalsetval는 롤백이 되지 않기 때문에 트랜잭션이 취소되어 데이터 추가가 없더라도 이미 증가한 시퀀스는 다시 되돌아가지 않습니다.

그리고 시퀀스를 생성할 때 캐시를 이용하는 경우 1보다 큰 값으로 캐시를 사용한다면 결번이 생길 가능성이 있습니다.
예로 들면 캐시를 10으로 설정하여 사용하는 경우 하나의 세션에서 10 번까지의 시퀀스를 미리 생성한 후 캐시에서 값을 그대로 불러오기만 하는 식으로 운용됩니다.
하지만 생성한 1~10 까지의 시퀀스 중 3까지만 사용하고 세션이 종료된다면 나머지 4~6은 사용하지 않고 그대로 버려집니다.
이 상태로 다음 세션에서 시퀀스를 생성한다면 11~20까지 세션이 만들어지고 중간에 결번이 생기게 됩니다.

이와 관련된 내용은 PosgreSQL 문서의 Notes에 기재되어 있습니다.

따라서 완전히 결번이 없는 고유한 수열 이 필요한 경우보다 다소의 결번을 허용하지만 고유한 수열이 필요한 경우 사용을 고려하는 것이 좋다고 생각됩니다.

Aurora PostgreSQL에서는?

Aurora PostgreSQL에서는 기본적으로 시퀀스에 캐시 버퍼를 사용합니다.
그래서 위에서 설명한 캐시를 사용할 때의 시퀀스 결번이 발생할 수 있습니다.

이와 관련된 글도 쉽게 찾아볼 수 있습니다.

실제로 확인해보면 다음과 같이 시퀀스에 결번이 생기는 것을 확인할 수 있었습니다.

(테이블 생성 후 시퀀스 번호 확인)
11

(첫 세션에서 35까지 시퀀스 생성 후 새로운 세션에서 시퀀스 확인)
22

위의 글에 적힌 내용대로 하나의 캐시에 33 단위로 시퀀스를 작성하는 것처럼 보였습니다.

마무리

완전히 결번이 없는 수열이 필요한 경우엔 데이터를 추가하는 단계에서 시퀀스가 아닌 새로운 컬럼을 추가하여 특정 숫자 혹은 문자를 가지도록 구성하는 것이 좋다고 생각합니다.

긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 must01940 지메일로 보내주시면 감사합니다.

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.