Sophia의 ‘Nav Tracker’ 애플리케이션은 성공으로 인해 shipment_logs 테이블이 기하급수적으로 성장했습니다. 수백만 건의 새로운 행이 매일 생성되면서 대시보드 지연, 보고서 처리 시간 증가, VACUUM 및 인덱스 재구축 시간 장기화, 오래된 데이터 삭제의 어려움 등 심각한 성능 및 관리 문제가 발생했습니다. Sophia는 대규모 테이블을 작고 관리하기 쉬운 조각으로 분할하는 PostgreSQL 테이블 파티셔닝을 도입했습니다.
파티셔닝 유형 및 선택
-
List Partitioning:
ship_ID등 특정 값을 기준으로 파티션을 나눕니다. -
Range Partitioning:
log_timestamp등 시간 또는 정수 계열 데이터의 범위(예: 날짜 범위)를 기준으로 파티션을 나눕니다. 파티션 가지치기(partition pruning)를 통해 쿼리 성능을 크게 향상시킵니다. -
Hash Partitioning: 데이터에 명확한 패턴이 없을 때 해시 함수에 따라 데이터를 분산합니다.
-
Composite Partitioning: List 및 Range 파티셔닝 등 여러 유형을 결합하여 복합적인 구조를 만듭니다.
파티셔닝 설계 및 관리 고려사항
-
대상 테이블 선정: 모든 테이블을 파티셔닝할 필요는 없으며, 작은 참조 테이블은 제외합니다.
-
기본 파티션(Default Partition): 정의된 파티션에 속하지 않는 데이터를 처리합니다. 편리하지만, 데이터가 많을 경우 새 파티션 추가 시 전체 테이블에 독점 잠금을 유발할 수 있습니다.
-
애플리케이션 변경: 파티셔닝 키를 테이블에 추가하고, 쿼리가 파티션 키를 명시적으로 필터링하도록 수정하여 파티션 가지치기를 활용해야 합니다.
-
PG Partman 활용: PostgreSQL 확장 도구인 PG Partman은 새 파티션 생성, 오래된 파티션 삭제 등 파티션 유지보수 작업을 자동화하여 관리 부담을 줄여줍니다.
-
기존 테이블 마이그레이션: 기존 대규모 테이블은 직접 파티션 테이블로 변환할 수 없으며, 새 파티션 테이블을 생성하고 데이터를 마이그레이션해야 합니다. PG Partman은 오프라인 및 온라인 마이그레이션 방법을 제공하여, 최소한의 다운타임으로 데이터 이동을 지원합니다.