과소평가된 Postgres: 더 나은 실행 계획을 위한 확장 통계
Source: Dev.to
위 링크에 있는 글의 본문을 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다. 현재는 번역할 텍스트가 포함되어 있지 않아 번역을 진행할 수 없습니다. 필요한 본문을 복사해서 알려 주세요.
Overview

Postgres의 기능 중 거의 알려지지 않았고 실제로는 거의 사용되지 않는(적어도 제가 프로덕션에서 거의 보지 못합니다) 것이 extended statistics이며, 이는 다중 컬럼 값들의 종속성, 관계 및 잠재적인 조합을 캡처하고 인코딩합니다.
쿼리 플래너는 일반적으로 단일 컬럼 통계에 기반해 실행 계획을 생성하지만, 실제 애플리케이션에서는 컬럼 간 관계가 매우 흔합니다. 저는 개인적으로 이 기능을 더 일찍 알았다면 좋았을 것 같습니다. 보통은 또 다른 인덱스를 추가해 접근 패턴을 개선하려고 하지만, 모든 인덱스의 비용이 원본 테이블 크기를 빠르게 초과하거나 그에 근접하게 됩니다. Extended statistics는 이러한 문제를 해결하기 위해 존재하며—추가 인덱스에 비해 가벼운 대안이 되는 경우가 많습니다.
단일 컬럼 통계의 문제점
PostgreSQL의 쿼리 플래너는 다양한 실행 계획의 비용을 추정하기 위해 통계에 크게 의존합니다. 기본적으로 개별 컬럼에 대한 통계를 수집합니다. 이는 컬럼들이 독립적일 때 잘 작동합니다. 그러나 실제 상황에서는 컬럼들이 상관관계를 갖는 경우가 많습니다.
예를 들어 users 테이블에 city와 country 컬럼이 있다고 가정해 보겠습니다. city = 'Paris'이면서 country = 'France'인 사용자를 조회하면, 플래너는 두 조건이 독립적이라고 가정하고 city = 'Paris'의 확률에 country = 'France'의 확률을 곱해 반환되는 행 수를 과소평가할 수 있습니다. 실제로는 도시가 파리이면 국가가 프랑스일 확률이 거의 100%에 가깝습니다.
이러한 과소평가는 플래너가 최적이 아닌 실행 계획(예: 해시 조인 대신 중첩 루프 조인)을 선택하게 만들 수 있으며, 그 결과 성능이 크게 저하됩니다.
확장 통계 입력
확장 통계는 열 간의 관계에 대해 PostgreSQL에 알려줄 수 있게 해줍니다. 여러 열에 대한 통계를 생성함으로써 플래너가 보다 정확한 추정치를 만들 수 있습니다.
확장 통계 만들기
CREATE STATISTICS 명령을 사용하여 확장 통계를 만들 수 있습니다. 다음은 간단한 예시입니다:
CREATE STATISTICS city_country_stats (dependencies)
ON city, country
FROM users;
이 명령은 users 테이블의 city 열과 country 열 사이의 함수적 종속성을 캡처하는 통계를 생성합니다.
확장 통계 유형
PostgreSQL은 여러 종류의 확장 통계를 지원합니다:
- Dependencies – 열 간의 함수적 종속성을 캡처합니다 (예:
city가country를 결정). 여러 동등 조건이 있는 쿼리에 유용합니다. - N‑Distinct – 열 조합에 대한 고유 값 수를 추정합니다.
GROUP BY쿼리에 유용합니다. - MCV (Most Common Values) – 여러 열에 걸친 가장 흔한 값 조합을 저장합니다. 복잡한 조건(예: 부등식,
OR절)이 있는 쿼리에 유용합니다.
다음과 같이 통계를 생성할 때 여러 유형을 지정할 수 있습니다:
CREATE STATISTICS complex_stats (dependencies, mcv)
ON col1, col2, col3
FROM my_table;
확장 통계 사용 시기
확장 통계는 특히 다음과 같은 경우에 유용합니다:
- 상관된 컬럼에 대해 여러 조건을 가진 쿼리가 있는 경우.
- 쿼리 플래너가 행 수를 지속적으로 과소추정하거나 과대추정하는 경우.
- 쿼리 플래닝을 개선하기 위해 다중 컬럼 인덱스를 추가하려는 경우(확장 통계가 종종 가벼운 대안이 됩니다).
일반적인 함정
- 과다 사용 – 모든 컬럼 조합에 대해 확장 통계를 만들지 마세요. 저장소를 소모하고
ANALYZE작업에 부하를 추가합니다. 특정 쿼리‑플래닝 문제가 확인될 때만 생성하세요. - ANALYZE 실행을 잊음 – 확장 통계를 만든 후에는 플래너가 이를 사용하도록 테이블에
ANALYZE를 실행해야 합니다. - 복잡한 표현식 – 확장 통계는 현재 단순 컬럼 참조에만 적용되며, 표현식(예:
LOWER(col))에는 적용되지 않습니다.
결론
Extended statistics are a powerful but underutilized feature in PostgreSQL. By providing the query planner with information about column relationships, you can significantly improve the performance of complex queries without the overhead of unnecessary indexes.
- Use
CREATE STATISTICSto capture dependencies, n‑distinct values, or MCVs. - Target specific queries where the planner is making poor estimates.
- Remember to
ANALYZEyour tables after creating statistics.