PostgreSQL · 2026-01-05

PostgreSQL 병렬 쿼리와 병렬화 최적화

PostgreSQL 병렬 쿼리의 작동 원리와 주요 설정 값을 중심으로 병렬화 성능을 개선하는 핵심 전략과 실무 적용 방법을 정리한 최적화 전략

작성일 : 2026-01-05 ㆍ 작성자 : 관리자
post
목차

개요

데이터베이스에서 병렬 처리의 목적은 단일 쿼리의 처리 시간을 줄이는 것이다. PostgreSQL은 쿼리 플래너와 실행기 수준에서 병렬화를 지원하며, 적절한 설정과 쿼리 작성으로 큰 성능 향상을 기대할 수 있다. 처음 접하는 사용자도 이해하기 쉽도록 기본 개념부터 설정, 실행 계획 해석, 실무 적용 순으로 설명한다.

병렬 쿼리의 기본 개념

작동 원리

PostgreSQL은 하나의 쿼리를 여러 워커 프로세스로 나눠 처리한다. 플래너가 병렬 실행이 유리하다고 판단하면 Gather나 Gather Merge 노드를 생성해 결과를 수집한다. 각 워커는 테이블 스캔, 조인, 집계와 같은 연산의 일부를 처리한다.

언제 병렬화가 유리한가

  • 대용량 테이블에 대한 전체 스캔이나 무거운 집계 작업
  • CPU 바운드 연산이 많은 쿼리
  • IO가 충분히 빠르고 CPU 코어가 여유가 있는 환경

핵심 파라미터와 의미

max_parallel_workers

시스템 전체에서 사용할 수 있는 병렬 워커의 최대 수다. 노드 전체의 동시 워커 수를 제한하므로 클러스터 수준에서 조절이 필요하다.

max_parallel_workers_per_gather

하나의 Gather 노드에서 허용되는 최대 워커 수를 지정한다. 일반적으로 이 값을 늘리면 단일 쿼리의 병렬도는 높아지지만 전체 시스템 부하를 고려해야 한다.

min_parallel_table_scan_size

테이블 스캔에 대해 병렬화를 고려할 최소 테이블 크기다. 작은 테이블에 대해선 병렬 오버헤드가 더 크므로 기본값을 통해 필터링된다.

parallel_setup_cost, parallel_tuple_cost

플래너가 병렬을 선택할지 판단하는 비용 모델 파라미터다. setup_cost는 병렬 초기화 비용, tuple_cost는 튜플 처리 비용을 의미한다. 비용 조정을 통해 병렬 선택 임계값을 변경할 수 있다.

설정 절차와 점검 항목

설정은 시스템 특성과 워크로드에 맞춰 단계적으로 수행한다. 다음 순서로 진행한다.

  • 현재 설정과 하드웨어 확인
  • max_parallel_workers 및 per_gather 값 조정
  • min_parallel_table_scan_size와 비용 파라미터 튜닝
  • 쿼리별로 실행 계획 확인하고 필요한 경우 쿼리 리팩터링
  • 모니터링을 통해 부작용(스케줄링 지연, CPU 포화 등) 확인

예시 설정 명령

ALTER SYSTEM SET max_parallel_workers = 32;
ALTER SYSTEM SET max_parallel_workers_per_gather = 8;
ALTER SYSTEM SET min_parallel_table_scan_size = '8MB';
ALTER SYSTEM SET parallel_setup_cost = 1000;
ALTER SYSTEM SET parallel_tuple_cost = 0.1;
SELECT pg_reload_conf();

실전 예제와 실행 계획 분석

아래 예제는 대용량 테이블에서 집계를 수행할 때 병렬화 전후의 차이를 보는 방법이다. 먼저 EXPLAIN ANALYZE로 실행 계획을 확인한다.

EXPLAIN ANALYZE
SELECT country, count(*)
FROM orders
WHERE created_at > now() - interval '1 year'
GROUP BY country;

실행 계획에서 Gather 또는 Parallel Seq Scan 노드가 보이면 병렬 실행이 적용된 것이다. Worker 수와 각 워커의 처리 시간을 확인해 병렬화 효과를 평가한다.

쿼리 튜닝 관점

  • 인덱스가 있더라도 대용량 집계는 병렬 스캔이 더 유리할 수 있다.
  • 조인 순서와 조인 방법(hash join vs nested loop)이 병렬 효율에 영향 준다.
  • 파티셔닝을 통해 병렬 스캔을 더 효과적으로 활용할 수 있다.

모니터링과 성능 검증

변경 후 반드시 모니터링을 수행한다. pg_stat_activity와 pg_stat_statements, 운영체제 레벨의 CPU 사용률을 함께 봐야 한다. 병렬 워커가 늘어나면 컨텍스트 스위치와 메모리 소비가 증가할 수 있으므로 전체 시스템 영향도를 관찰한다.

주의사항

  • 작은 쿼리에 무리하게 병렬을 적용하면 오히려 느려질 수 있다.
  • 동시에 많은 병렬 쿼리가 실행되면 스케줄링 경합으로 전체 성능이 저하된다.
  • 복제나 백업 시 워커 수 증가는 예기치 않은 부하를 만들 수 있다.

결론

PostgreSQL 병렬 쿼리는 큰 성능 향상을 가져올 수 있지만 환경과 워크로드에 맞춘 세심한 조정이 필요하다. 핵심 파라미터를 이해하고 단계적으로 적용하며 실행 계획과 시스템 지표를 통해 검증하는 과정이 중요하다. 적절한 설정과 쿼리 구조 개선을 병행하면 안정적으로 병렬화를 활용할 수 있다.

postgres 병렬 쿼리 설정 parallel query postgres 튜닝 postgres parallel_workers 설정 PostgreSQL 병렬화 max_parallel_workers_per_gather parallel_setup_cost min_parallel_table_scan_size parallel_tuple_cost