6.2 Hash aggregate와 group
PostgreSQL은 grouping에 HashAggregate, GroupAggregate, MixedAggregate 등을 선택합니다. Group 수 estimate와 input ordering이 중요합니다.
EXPLAIN (ANALYZE, BUFFERS)
SELECT customer_id, sum(amount), count(*)
FROM orders
GROUP BY customer_id;
HashAggregate의 Batches, Memory Usage, Disk Usage를 확인합니다. Group 수를 작게 추정하면 runtime에 hash table이 커지거나 spill로 이어지기도 합니다.
GroupAggregate는 정렬된 input이 필요하지만 index 또는 이전 node가 ordering을 제공하면 별도 sort가 없을 수 있습니다.
개선 순서
- Group key의
n_distinctestimate를 확인합니다. - Filter를 먼저 적용해 input을 줄입니다.
- 불필요한 wide column을 aggregate 앞에서 제외합니다.
work_mem실험으로 spill 영향을 측정합니다.- 반복되는 expensive aggregate는 summary table과 materialized view의 freshness 비용을 비교합니다.
COUNT(DISTINCT ...)와 여러 distinct aggregate는 memory와 sort 비용이 크게 달라질 수 있습니다. 실제 plan node와 temp I/O를 확인합니다.