선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 PostgreSQL 실측 결과가 아닙니다. SQL/인덱스 설정은 검증 후 적용해야 합니다.
상황: 회원 상태 INAC는 소수, ACTV는 다수일 수 있다. 옵티마이저가 이 분포를 제대로 추정하는지 확인한다.
BAD SQL — 비교 대상
-- 실제 SQL 수행 없이 통계 기반 추정만 확인
EXPLAIN
SELECT m.mbr_id, m.mbr_gd
FROM ms_mbr_big AS m
WHERE m.mbr_st = 'INAC';
SQL
복사
GOOD SQL — 개선 후보
EXPLAIN (ANALYZE, BUFFERS)
SELECT m.mbr_id, m.mbr_gd
FROM ms_mbr_big AS m
WHERE m.mbr_st = 'INAC';
-- 같은 조건의 분포 통계 확인
SELECT tablename, attname, n_distinct,
most_common_vals, most_common_freqs
FROM pg_stats
WHERE schemaname = current_schema()
AND tablename = 'ms_mbr_big'
AND attname = 'mbr_st';
SQL
복사
예상 실행계획 — 실측 아님
EXPLAIN (선택성이 높다고 판단할 때)
Index Scan using ms_mbr_big_x11 on ms_mbr_big
Index Cond: (mbr_st = 'INAC')
rows = [통계 기반 예상 반환 행 수]
EXPLAIN ANALYZE (실제 실행한 경우에만)
Index Scan / Seq Scan on ms_mbr_big
actual rows = [측정된 루프당 평균 출력 행 수]
loops = [측정된 반복 횟수]
Buffers = [측정된 접근량]
예상 rows와 actual rows를 비교해
선택도 오판·낡은 통계·파라미터 값 편차 여부를 검토
Plain Text
복사
핵심
•
계획의 rows는 옵티마이저가 추정한 결과 건수다. 실제와 큰 차이가 지속되면 JOIN 방법이나 인덱스 선택이 불리해질 수 있다.
원본 규칙: 개편 전 12-05.
참고·예외
•
예상·실제 건수의 차이가 있다고 모두 통계 오류는 아니다. 파라미터 값의 분포, 컬럼 간 상관관계, 다중 조건, 계획 캐시 등도 원인일 수 있다. ANALYZE는 통계를 갱신하지만 원하는 인덱스를 반드시 선택하도록 강제하지 않는다. 집계 후 1행만 표시되는 노드와 집계 아래 스캔 노드를 구분해서 본다.



