Production Query Plans Without Production Data

Author: Radim Marek | Source: https://boringsql.com/posts/portable-stats/ | Published: 2026-03-08


한 줄 요약

PostgreSQL 18의 portable statistics 기능(pg_restore_relation_stats, pg_restore_attribute_stats, pg_dump —statistics-only)을 통해 프로덕션 데이터 없이도 프로덕션과 동일한 쿼리 플랜을 테스트/CI 환경에서 재현할 수 있게 되었다.

핵심 주장/내용

  • CI 환경(1,000행)과 프로덕션(5,000만 행)에서 플래너가 완전히 다른 결정을 내리므로, CI에서의 EXPLAIN은 프로덕션 플랜에 대해 아무것도 알려주지 않는 근본 문제가 있었다
  • pg_restore_relation_stats로 테이블 수준 통계(relpages, reltuples)를, pg_restore_attribute_stats로 컬럼 수준 통계(histogram bounds, MCV, correlation)를 직접 카탈로그에 주입할 수 있다
  • 테이블 통계만으로는 플랜이 바뀌지 않으며, 히스토그램 바운드(selectivity)와 MCV 리스트(skewed distribution)까지 주입해야 Seq Scan→Index Scan 같은 플랜 전환이 발생한다
  • pg_dump —statistics-only로 프로덕션 통계를 1MB 미만의 SQL 파일로 추출하여 테스트 DB에 주입하는 워크플로우를 제공한다
  • autovacuum의 ANALYZE가 주입된 통계를 덮어쓰므로, 테스트 테이블에서 autovacuum_enabled=false 설정이 필요하며, CREATE STATISTICS(다변량 통계)는 PostgreSQL 19의 pg_restore_extended_stats()에서 지원 예정이다

주요 수치 / 사실

  • 통계 덤프 크기: 수백 테이블/수천 컬럼 DB에서도 1MB 미만
  • 예시 시나리오: 10,000행 테스트 테이블에 5,000만 행 프로덕션 통계 주입
  • 보안: MAINTAIN 권한 필요 (PostgreSQL 17에서 도입), pg_maintain 롤로 부여 가능
  • PostgreSQL 18 새 pg_dump 플래그: —statistics, —statistics-only, —no-statistics
  • PostgreSQL 19 예정: pg_restore_extended_stats()로 다변량 통계 지원

관련 위키


Source: 원문 보기