원문 캡처 · manishrjain.com
원문 캡처 · manishrjain.com

개발자 마니시 자인(Manish Jain)이 PostgreSQL 프로토콜을 지원하는 새 데이터베이스 Egres를 공개했다. 현재 릴리스는 단일 노드이며, 쿼리 기능은 기본 수준으로 동등 비교와 조인 없이 동작한다. 수백 개 이상의 인덱스가 있는 테이블, 디스크에 테라바이트 규모의 데이터가 있는 환경, 한 노드에서 여러 테넌트를 운영하는 환경을 겨냥한다.

Egres는 PostgreSQL의 포크나 포트가 아니라, PostgreSQL 프로토콜과 SQL을 지원하도록 처음부터 만든 데이터베이스다. 기존 psql과 드라이버, ORM을 그대로 연결할 수 있다. 제작자는 Egres가 프로세스별 연결 구조 대신 단일 프로세스에서 쿼리를 실행하고, 쿼리별·테넌트별 CPU·메모리·디스크 입출력량을 측정하는 설계를 채택했다고 설명한다. 다만 현재 릴리스에서는 프로세스 전체 메모리만 추적하며, 쿼리 도중 자원 사용량을 제한하는 기능은 향후 릴리스에 예정돼 있다.

벤치마크와 적용 조건

자인은 16코어 Ryzen 5950X에서 서버별 메모리를 64GiB로 제한하고, 6억 행(580GiB 데이터)을 대상으로 PostgreSQL 18과 비교했다. 제작자가 공개한 결과는 다음과 같다.

측정 항목PostgreSQL 18Egres
적재 종료 시 디스크 사용량693 GiB376 GiB, 46% 적음
실행 중 기록한 데이터량(쓰기 증폭)3.0 TiB (5.2×)2.3 TiB (4.0×), 23% 적음
세 쿼리 평균 지연시간(기하평균)3.5 ms1.3 ms, 2.8배 빠름
네 번째 쿼리의 두 인덱스 조회(p95)490 ms3.9 ms, 126배 빠름
안정화 단계 종료 시 읽기 트랜잭션/초993,739
적재 속도101,654행/초88,259행/초, 13% 느림

이 결과는 해당 하드웨어와 구성, 쿼리에서 얻은 수치다. 제작자는 데이터가 메모리에 충분히 들어갈 때는 PostgreSQL이 더 높은 트랜잭션 처리량을 보였고, 데이터가 늘어난 뒤에는 Egres가 유리했다고 설명한다. 두 인덱스를 함께 쓰는 쿼리에서는 Egres의 비트맵 인덱스가 복합 인덱스 없이도 빠르게 동작했다. 반면 테이블 곳곳에 흩어진 75개 행을 찾는 고객 쿼리에서는 디스크에서 블록을 읽을 때 압축 해제 비용이 더해져 Egres의 p95와 p99가 6~8ms 늘었고, PostgreSQL이 33% 빨랐다. PostgreSQL에 (sku, day) 같은 복합 인덱스를 추가하면 비교 결과가 달라질 수 있다고 자인도 덧붙였다. 벤치마크 문서에는 방법론과 재현 절차가 공개돼 있다.

저장 방식과 현재 제약

Egres의 저장 엔진 zdb는 여러 LSM 트리를 묶은 구조로, 블록 압축과 체크섬, 버전 관리, 가비지 컬렉션을 사용한다. 제작자는 데이터베이스나 테이블을 복사 없이 즉시 분기할 수 있고, 분기할 때 인덱스도 함께 복제된다고 설명한다. 업데이트된 행의 오래된 버전은 압축 작업 중 정리하므로 PostgreSQL의 VACUUM이나 pg_repack에 해당하는 작업이 필요하지 않다는 것이 제작자의 설계 설명이다.

저장 데이터는 로컬 디스크 또는 S3 API를 사용하는 오브젝트 스토리지에 둘 수 있다. 오브젝트 스토리지를 쓸 때도 쓰기 로그(WAL)는 로컬 디스크에 남는다. Raft 기반 복제와 여러 노드 구성은 코드에 포함돼 있지만 아직 활성화되지 않았으며, 제작자는 다음 릴리스에서 제공할 계획이라고 밝혔다. 따라서 현재 릴리스에서 사용할 수 있는 것은 단일 노드다. 직렬화 격리 수준도 향후 기능이며, 현재는 PostgreSQL의 반복 읽기에 해당하는 스냅샷 격리를 제공한다.

설치 대상은 Linux x86_64와 Apple silicon Mac이다. 빠른 시작은 퀵스타트 안내를 따르면 된다. 기존 psql로 접속하는 방법은 다음과 같다.

curl -fsSL https://egresql.io/install.sh | sh egres

psql -h localhost -p 3210 -d egres

소스에서 빌드하려면 Zig 0.16이 필요하다. 제작자는 현재 쿼리 기능이 제한적이므로 미완성된 부분이 있을 수 있다고 안내했다. 기능 범위는 PostgreSQL 호환성 문서에서 확인할 수 있다.