Search

REMINDER 11-08. 추정 rows와 실제 rows가 크게 다르면 통계와 조건을 확인하자

⚠️
선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 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행만 표시되는 노드와 집계 아래 스캔 노드를 구분해서 본다.