한국정보기술진흥원
한국정보기술신문
thumbnail

정보기술 ·

UUID 버전 4, 데이터베이스 기본키로 부적합...성능 저하 심각

발행일
읽는 시간2분 10초

무작위성으로 인한 인덱스 분할과 과도한 I/O 발생, 정수형 또는 UUID v7 사용 권장

[한국정보기술신문] 데이터베이스 전문가들이 UUID 버전 4를 데이터베이스의 기본키(Primary Key)로 사용하는 것에 대해 강력히 경고하고 나섰다. PostgreSQL 전문 컨설턴트이자 '고성능 PostgreSQL for Rails' 저자인 앤디 앳킨슨은 지난 7월 자신의 블로그를 통해 UUID v4 사용 시 발생하는 심각한 성능 문제를 상세히 분석했다.

UUID(Universally Unique Identifier)는 128비트(16바이트) 크기의 고유 식별자로, 마이크로소프트에서는 GUID로 불린다. 특히 UUID v4는 122비트가 무작위 값으로 생성되는 특징을 가지고 있어, PostgreSQL 13 버전부터 제공되는 gen_random_uuid() 함수로 쉽게 생성할 수 있다.

무작위성이 초래하는 성능 문제

UUID v4의 가장 큰 문제는 바로 무작위성이다. 정수형 기본키의 경우 B-Tree 인덱스의 리프 노드에 순차적으로 추가되지만, UUID v4는 무작위 페이지에 삽입된다. 이는 불필요한 인덱스 페이지 분할과 재조정을 유발하며, 쓰기 작업 지연시간과 WAL(Write Ahead Log) 생성량을 증가시킨다.

실제 테스트 결과는 더욱 충격적이다. Cybertec의 안츠 아스마가 진행한 실험에서 1,000만 개 행에 대해 100만 건의 업데이트를 수행한 결과, 정수형 인덱스는 27,332번의 버퍼 히트가 발생한 반면, UUID v4 인덱스는 856만 2,960번의 버퍼 히트를 기록했다. 이는 68.3GB의 추가 데이터 접근을 의미하며, 메모리 속도에 따라 0.86초에서 3.4초의 추가 지연시간이 발생한다.

공간 효율성과 캐시 성능 저하

UUID는 정수형에 비해 저장 공간도 비효율적이다. UUID는 16바이트를 차지하는 반면, bigint는 8바이트, 일반 정수는 4바이트만 사용한다. 수백만 개의 행을 가진 테이블에서 이러한 차이는 백업과 복원 과정에서 상당한 부담으로 작용한다.

pageinspect 확장을 통한 인덱스 밀도 분석 결과, 정수형 인덱스는 평균 97.64%의 채움률을 보인 반면, UUID v4 인덱스는 79.06%에 불과했다. 이는 UUID 인덱스가 정수형 대비 약 40% 더 많은 I/O를 발생시킨다는 것을 의미한다.

보안성에 대한 오해

많은 개발자들이 UUID v4를 보안상의 이유로 선택하지만, 이는 잘못된 인식이다. RFC 4122 표준 문서는 "UUID를 추측하기 어렵다고 가정하지 말 것"이라며 "보안 기능으로 사용해서는 안 된다"고 명시하고 있다.

앳킨슨은 정수형 키에서 XOR 연산과 base62 인코딩을 활용하여 추측 불가능한 난독화 코드를 생성하는 방법을 대안으로 제시했다. 이 방식은 내부적으로는 정수형의 성능 이점을 유지하면서 외부적으로는 난독화된 식별자를 제공할 수 있다.

대안과 완화 방법

앳킨슨은 새로운 데이터베이스의 경우 시퀀스 기반 정수형 또는 bigint 사용을 강력히 권장한다. 성장 가능성이 불확실한 비즈니스 애플리케이션에는 4바이트 정수형으로도 충분하며, 소셜 미디어나 센서 데이터 수집 같은 대규모 애플리케이션에는 8바이트 bigint가 적합하다.

UUID를 반드시 사용해야 하는 경우에는 UUID v7 사용을 권장한다. UUID v7은 첫 48비트에 타임스탬프를 포함하여 시간 순서대로 정렬이 가능하며, 무작위 UUID v4의 성능 문제를 상당 부분 해결한다. PostgreSQL 18 버전에서 UUID v7이 정식 지원될 예정이며, 현재는 pg_uuidv7 확장을 통해 사용 가능하다.

기존 UUID v4 데이터베이스의 경우 버퍼 캐시 크기 확대, work_mem 설정 조정, 주기적인 인덱스 재구축, created_at 같은 시간 기반 컬럼에 대한 클러스터링 등의 완화 방법을 고려할 수 있다.

Buildkite는 시간 순서 UUID로 전환한 후 WAL 쓰기 I/O가 50% 감소했다고 보고했다. 이는 적절한 UUID 버전 선택이 데이터베이스 성능에 미치는 영향을 잘 보여준다.

한국정보기술신문 정보기술분과 유상헌 기자 news@kitpa.org