20161019

PostgreSQL 9.6 병렬 쿼리 체감

PostgreSQL 9.6 올리고 가장 기대했던 병렬 쿼리 체감 테스트.

세팅. 기본값은 max_parallel_workers_per_gather = 2. 늘려봐야 의미 있는 쿼리에서만 효과 봄.

max_worker_processes = 8
max_parallel_workers_per_gather = 4

테스트 쿼리: 1억 행 테이블에서 aggregate. 컬럼 인덱스 없음 (full scan 상황).

SELECT country, COUNT(*) FROM sales_log GROUP BY country;

-- 9.5 (직렬): 38.2 s
-- 9.6 (4 worker): 11.6 s

약 3.3배. 워커 수만큼 그대로 스케일 안 되는건 마스터 프로세스에서 집계/합치는 비용 때문. 그래도 체감은 확실.

병렬이 실제 적용되는지는 EXPLAIN ANALYZE에서 Gather 노드가 보이는지로 확인. 없으면 옵티마이저가 병렬을 안 택한거.

제약 많음:

  • CTE는 기본적으로 병렬 안됨
  • Trigger 있는 테이블은 제약
  • 사용자 정의 함수 대부분 PARALLEL UNSAFE로 간주되어 병렬 안됨. CREATE FUNCTION ... PARALLEL SAFE 명시해야 함
  • 작은 테이블엔 병렬이 오히려 오버헤드. min_parallel_relation_size 파라미터로 임계값 조정 가능

OLAP 성격의 쿼리 (집계, 리포트)에는 진짜 효과 있음. OLTP (짧은 쿼리 많은 경우)엔 영향 없음.

추가로 9.6에서 눈에 띄는 것: freeze 튜닝 자동화, replication slot 사용성 개선. upsert는 이미 9.5에 들어왔고 이번엔 내부 최적화 위주라고 보면 됨. 우리 DWH 목적 DB에는 다음 달 중 9.6 반영 예정.

댓글 없음: