COUNT의 DISTINCT가 병렬 쿼리를 망친다
The DISTINCT in Your COUNT

PostgreSQL에서 count(DISTINCT user_id) 같은 집계는 병렬 처리가 불가능해 단일 코어로 전체 테이블을 정렬한다. 이 글은 1천만 행 테이블에서 count(DISTINCT)가 115MB를 디스크에 쓰며 1.2초 걸리는 반면, GROUP BY로 재작성하면 병렬 해시로 0.36초에 끝난다는 것을 보여준다. DISTINCT나 ORDER BY가 포함된 집계는 부분 집계와 결합 함수가 없어 병렬화가 원천적으로 불가능하며, 같은 SELECT의 다른 집계까지 직렬로 끌어내린다. 해결책은 DISTINCT를 GROUP BY로 밀어 넣는 것이다.
한 단어 DISTINCT가 전체 문장의 병렬 쿼리를 끄고, 테이블이 클수록 비용이 커진다.