EXPLAIN ANALYZE + 인덱스 + 파티셔닝 + 집계 테이블 분리 경험으로 설명
팀 프로젝트에서 PostgreSQL로 데이터 모델링을 처음 직접 했습니다. 초기엔 정규화에만 집중해서 쿼리가 여러 테이블을 조인하는 구조가 됐고, 데이터가 쌓이면서 복잡한 조인 쿼리의 응답 시간이 늘어나는 문제가 생겼습니다. EXPLAIN ANALYZE로 실행 계획을 분석해서 인덱스가 없는 조인 컬럼을 찾아 인덱스를 추가했습니다. 날짜 범위 조회가 많은 테이블에는 파티셔닝을 적용해서 조회 범위를 좁히는 방식을 써봤습니다. 통계 쪽에서는 VACUUM ANALYZE를 주기적으로 실행해서 플래너가 최신 통계를 사용하도록 유지했습니다. 정규화와 성능은 트레이드오프가 있어서, 조회 빈도가 높은 집계 데이터는 읽기 전용 집계 테이블을 별도로 두는 방식을 선택했습니다.