PostgreSQL의 해시 파티셔닝은 특정 파티션 키에 해시 함수를 적용하여 데이터를 여러 파티션에 분산시키는 방식입니다. 이는 대용량 테이블의 인덱스 조회 속도를 높이고, autovacuum 부하를 줄이며, 파티션 제거(partition pruning)를 통해 쿼리 성능을 개선하는 이점을 제공합니다. 하지만 WHERE
절을 통해 부모 테이블에 쿼리할 경우, PostgreSQL은 파티션 키 파싱, 해시 값 계산, pg_class
및 pg_inherits
테이블을 통한 파티션 계층 구조 탐색, 최종 실행 계획 수립 등 복잡하고 비용이 많이 드는 카탈로그 조회 과정을 거쳐야 합니다. 이러한 CPU 오버헤드는 쿼리 부하가 높을수록 두드러지게 나타납니다.
이러한 문제를 해결하기 위해, 애플리케이션이 이미 파티션 키 값을 알고 있는 상황에서 PostgreSQL의 카탈로그 조회 과정을 완전히 우회하는 방법이 제시됩니다. 이는 애플리케이션 코드 내에서 직접 대상 파티션의 이름을 계산하여 해당 파티션에 직접 쿼리하는 방식입니다. 이 접근 방식은 PostgreSQL의 내부 해시 로직을 재구현한 Ruby Gem인 pg_hash_func
를 통해 구현될 수 있습니다. pg_hash_func
는 PostgreSQL의 src/common/hashfn.c
및 src/backend/access/hash/hashfunc.c
에 있는 lookup3
해시 함수와 파티션 관련 로직을 복제하며, 현재 bigint
, integer
, smallint
와 같은 정수 기반 해시 파티셔닝을 지원합니다. 이 Gem을 사용하면 복잡한 비트 조작, 부호/비부호 산술 변환, 그리고 PostgreSQL 내부에서 사용되는 매직 상수를 모두 처리하여 애플리케이션에서 정확한 파티션 인덱스를 얻을 수 있습니다.
성능 벤치마크 결과에 따르면, Ruby 애플리케이션에서 파티션 인덱스를 직접 계산하는 방식은 PostgreSQL 함수를 직접 호출하는 SQL 기반 방식보다 20배에서 40배까지 빠른 성능을 보였습니다. 이는 데이터베이스와의 네트워크 왕복을 완전히 제거하고, 데이터베이스가 카탈로그 테이블을 조회하는 데 드는 추가적인 CPU 부하를 없애기 때문입니다. 비록 SQL 기반 솔루션으로 PostgreSQL 함수를 직접 호출하는 방법도 카탈로그 조회는 피할 수 있지만, 네트워크 왕복 비용은 여전히 발생합니다.