ANALYZE와 pg_statistic
ANALYZE로 플래너 통계를 최신 상태로 유지하고 pg_statistic을 살펴보며 상관관계가 있는 열에는 확장 통계를 사용해보세요.
ANALYZE와 pg_statistic은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
왜 ANALYZE를 사용할까요
쿼리 플래너는 적절한 계획을 선택하기 위해 행 수와 선택도를 추정해야 합니다. 이러한 추정치는 ANALYZE가 수집한 열별 통계에서 가져옵니다.
ANALYZE를 실행할 시점
자동 진공 처리는 행 변경 임계값에 따라 ANALYZE를 자동으로 실행합니다. 대량 적재나 대규모 DELETE 후에는 계획의 품질이 저하되지 않도록 수동으로 실행합니다:
ANALYZE orders;
ANALYZE (VERBOSE) orders;표본 추출
ANALYZE는 열마다 수백 개의 행을 표본으로 추출합니다. 기본값으로 추정치가 부정확하다면 통계 대상을 조정합니다:
ALTER TABLE orders ALTER COLUMN customer_id SET STATISTICS 1000;
-- Up from default 100. ANALYZE will sample more rows.pg_statistic
통계가 저장되는 시스템 카탈로그입니다(읽기 쉽게 보려면 pg_stats 뷰를 사용합니다):
SELECT attname, n_distinct, most_common_vals, most_common_freqs, histogram_bounds
FROM pg_stats
WHERE schemaname = 'public' AND tablename = 'orders';플래너가 확인하는 항목
- n_distinct — 서로 다른 값의 개수
- most_common_vals — 가장 많이 나타나는 값과 그 빈도
- histogram_bounds — 범위 쿼리를 위한 구간
- correlation — 물리적 순서와 논리적 순서의 상관관계(스캔 비용에 영향을 줌)
확장 통계
열별 통계만으로는 열 사이의 상관관계를 파악할 수 없습니다. CREATE STATISTICS를 사용하면 이러한 관계를 수집할 수 있습니다:
CREATE STATISTICS orders_country_status (dependencies)
ON country, status FROM orders;
ANALYZE orders;
-- Now the planner knows that country='US' AND status='paid' is correlated
-- (e.g. most US orders happen to be 'paid').다변량 통계 종류
dependencies— 함수적 종속성(한 열이 다른 열을 예측함)ndistinct— 서로 다른 값 조합의 개수mcv— 가장 많이 나타나는 결합 값(PG 12 이상)
잘못된 추정치 → 잘못된 계획
"쿼리가 느린 이유가 무엇인가요?"라는 질문의 가장 흔한 원인은 잘못된 행 추정치입니다. 플래너는 행이 1개라고 예상하여 중첩 루프를 선택하지만, 실제 행 수는 1,000,000개일 수 있습니다.
EXPLAIN ANALYZE SELECT * FROM ... ;
-- Look at Plan rows vs actual rows. Big gap = run ANALYZE or add extended stats.마이그레이션에서 ANALYZE 강제 실행
대규모 대량 적재 후:
COPY users FROM ... ;
ANALYZE users;
-- Without ANALYZE, the planner has no idea the table just grew.데이터 편향이 있으면 통계가 자동으로 업데이트되지 않음
오늘의 데이터가 어제의 데이터와 크게 다르면 자동 ANALYZE가 실행될 때까지 통계가 오래된 상태로 남아 있을 수 있습니다. 데이터 형태가 바뀐 후에는 수동으로 ANALYZE를 실행합니다.
pg_class.reltuples
플래너는 pg_class에서 가져온 예상 행 수도 사용합니다. 이 값은 VACUUM 또는 ANALYZE가 업데이트합니다. 다음과 같이 빠르게 확인할 수 있습니다:
SELECT relname, reltuples FROM pg_class WHERE relname = 'orders';복습
ANALYZE는 플래너에 정보를 제공합니다.
- 대규모 데이터 변경 후 실행합니다
- 편향된 열의 STATISTICS 대상을 늘립니다
- 열 사이의 상관관계에는 CREATE STATISTICS를 사용합니다
- 예상치와 실제 값의 차이가 크다면 가장 먼저 해결해야 합니다
빠른 확인
단일 열 WHERE 조건에서 EXPLAIN ANALYZE의 예상 행 수는 1이지만 실제 행 수는 500,000으로 표시됩니다. 가장 먼저 해결할 방법은 무엇인가요?
자주 묻는 질문
“ANALYZE와 pg_statistic” 강의는 무료인가요?
네 — “ANALYZE와 pg_statistic” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“ANALYZE와 pg_statistic”에서 뭘 배우나요?
ANALYZE로 플래너 통계를 최신 상태로 유지하고 pg_statistic을 살펴보며 상관관계가 있는 열에는 확장 통계를 사용해보세요. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“ANALYZE와 pg_statistic” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- MVCC와 비대화의 원인
- VACUUM, autovacuum, vacuum_cost_delay
- ANALYZE와 pg_statistic
- 인덱스 전용 스캔과 가시성 맵