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 반영 예정.
댓글 없음:
댓글 쓰기