SQLite 데이터베이스에서 UUID(범용 고유 식별자)를 기본 키(Primary Key)로 사용할 경우, 특히 무작위성이 강한 UUIDv4는 데이터 삽입 성능을 크게 저하시킬 수 있다는 연구 결과가 발표되었습니다. 이는 데이터베이스의 핵심 구조인 B-트리 인덱스의 잦은 재균형화와 추가적인 페이지(paging) 비용을 유발하기 때문입니다. 정수형 기본 키가 초당 100만 건의 삽입 성능을 보이는 반면, UUIDv4를 사용하면 삽입 속도가 14~16배까지 느려지는 것으로 나타났습니다.
SQLite의 테이블은 기본적으로 'rowid'라는 암묵적인 64비트 정수 기본 키를 가지며, 이 rowid가 물리적 저장 순서를 결정하는 클러스터드 인덱스(clustered index) 역할을 합니다. 반면, 'WITHOUT ROWID' 테이블에서는 사용자가 선언한 기본 키가 클러스터드 인덱스가 됩니다. UUIDv4는 그 특성상 무작위로 생성되므로, 이를 클러스터드 인덱스로 사용하면 B-트리에 행이 무작위로 삽입되어 트리의 균형을 계속해서 재조정해야 합니다. 이 과정에서 읽기 및 쓰기 작업에 더 많은 시간이 소요되며, 이는 프로파일링 결과에서도 명확히 드러났습니다. 시간 순서가 반영된 UUIDv7은 UUIDv4의 정렬 문제를 일부 해결하여 삽입 성능을 개선했지만, 16바이트 BLOB 키를 사용하기 때문에 8바이트 정수 키보다는 여전히 느립니다.
이러한 성능 저하 문제는 SQLite에만 국한되지 않고, 클러스터드 인덱스를 사용하는 다른 데이터베이스 시스템에도 동일하게 적용될 수 있습니다. 분산 시스템 환경에서 유일한 ID를 생성하기 위해 UUID를 사용하는 경우가 많지만, 기본 키로 사용할 때는 데이터베이스의 내부 동작 방식과 성능에 미치는 영향을 충분히 이해해야 합니다. 특히, 단일 데이터베이스 내에서 높은 삽입 성능이 요구되는 경우, 단조 증가하는 정수형 기본 키를 사용하는 것이 훨씬 효율적일 수 있습니다. 개발자들은 시스템의 확장성, 데이터 유일성, 그리고 성능 요구사항을 종합적으로 고려하여 가장 적합한 기본 키 전략을 선택해야 합니다.