본문 바로가기
C.W.K.
Stream
Lesson 09 of 10 · published

EXPLAIN과 EXPLAIN ANALYZE

~14 min · apps, performance

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

느린 질의를 추측하지 마

EXPLAIN은 실행하지 않고 계획기의 선택을 보여주고, EXPLAIN ANALYZE는 실제로 실행해 시간과 행 수를 기록해. BUFFERS를 더하면 캐시와 디스크에서 읽은 블록도 볼 수 있어.

예상과 실제를 비교해

큰 테이블의 Seq Scan은 빠진 색인을, 예상 행과 실제 행의 큰 차이는 낡은 통계를 의심해. 비용이 집중된 노드를 먼저 보고, Buffers: shared read가 크면 디스크 접근과 작업 집합을 확인해. Nested Loop의 반복 횟수가 크면 숨은 N+1인지 살피고 hash join이 더 나은지도 비교해.

느린 질의를 자동으로 남겨

auto_explain의 log_min_duration을 1s처럼 정하면 임계값을 넘긴 실행 계획을 로그에 남길 수 있어. depesz나 pgMustard로 시각화해도 좋아.

auto_explain을 켜고 1초를 기준으로 삼았다면 1초를 넘는 질의가 실제 실행 계획과 함께 남는지 확인해.

Code

핵심 옵션을 넣은 EXPLAIN·sql
EXPLAIN (ANALYZE, BUFFERS, SETTINGS, FORMAT TEXT)
SELECT u.name, COUNT(o.id) AS orders
FROM   users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE  u.created_at >= now() - INTERVAL '90 days'
GROUP  BY u.name
HAVING COUNT(o.id) >= 3
ORDER  BY orders DESC
LIMIT  10;
auto_explain으로 느린 질의 자동 기록하기·sql
-- postgresql.conf 또는 SET (세션별)
LOAD 'auto_explain';
SET auto_explain.log_min_duration = '1s';
SET auto_explain.log_analyze = on;
SET auto_explain.log_buffers = on;

-- 이제 1s+ 쿼리가 EXPLAIN ANALYZE 로깅.
depesz나 pgMustard로 실행 계획 시각화하기·text
# EXPLAIN 출력을 paste:
# - https://explain.depesz.com/
# - https://www.pgmustard.com/
# 둘 다 비싼 노드 색깔로 highlight + 무슨 일인지 설명.

External links

Exercise

프로젝트에서 가장 느린 질의를 골라 EXPLAIN (ANALYZE, BUFFERS)를 실행해. 출력을 explain.depesz.com에서 시각화하고 가장 비용이 큰 노드를 찾아. 색인, 질의 재작성, 통계 중 한 방법으로 개선한 뒤 다시 측정해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.