데이터베이스 쿼리 플래너(Query Planner/Optimizer)는 SQL 쿼리를 가장 효율적인 방법으로 실행하기 위한 실행 계획을 생성하는 DBMS 컴포넌트다. 통계 정보와 비용 모델을 사용해 최적 경로를 선택한다.
쿼리 처리 파이프라인
SQL 문자열
↓ 파서 (Parser)
파스 트리 (Parse Tree)
↓ 분석기 (Analyzer)
쿼리 트리 (Query Tree)
↓ 옵티마이저 (Planner/Optimizer)
실행 계획 (Execution Plan)
↓ 실행기 (Executor)
결과
sql
-- 실행 계획 + 실제 실행 통계
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT a.title, u.name, COUNT(c.id) AS comments
FROM articles a
JOIN users u ON u.id = a.author_id
LEFT JOIN comments c ON c.article_id = a.id
WHERE a.published = true AND a.created > '2024-01-01'
GROUP BY a.title, u.name
ORDER BY comments DESC
LIMIT 10;
-- 출력 해석:
-- Seq Scan: 전체 테이블 스캔 (비용 높음)
-- Index Scan: 인덱스 사용 (빠름)
-- Bitmap Heap Scan: 인덱스 + 힙 스캔 결합
-- Hash Join: 해시 테이블 기반 조인
-- Nested Loop: 중첩 반복 조인 (작은 테이블)
-- Merge Join: 정렬된 데이터 병합 조인
-- rows=X: 예상 행 수 (actual rows=Y 와 차이 주의)
-- cost=0.00..123.45: 시작/종료 비용 (상대값)
-- Buffers: shared hit=X read=Y (캐시 적중률)
통계 정보 관리
sql
-- 통계 수동 갱신
ANALYZE articles;
ANALYZE VERBOSE articles; -- 자세한 출력
-- 컬럼별 통계 정밀도 설정 (기본 100, 최대 10000)
ALTER TABLE articles ALTER COLUMN category
SET STATISTICS 500; -- 히스토그램 버킷 수
-- 현재 통계 확인
SELECT
attname,
n_distinct, -- 고유값 수 (-1.0 = 고유값이 행 수 비율)
correlation, -- 물리적 정렬과 논리적 순서 상관관계
most_common_vals, -- 가장 빈번한 값
most_common_freqs
FROM pg_stats
WHERE tablename = 'articles';
-- 확장 통계 (컬럼 간 상관관계)
CREATE STATISTICS articles_stats (ndistinct, dependencies)
ON category, status FROM articles;
ANALYZE articles;
관련 문서