**EXPLAIN**은 PostgreSQL의 쿼리 실행 계획(query execution plan) — 쿼리를 어떻게 실행할지(어떤 스캔, 조인, index) — 을 보여줍니다. **EXPLAIN ANALYZE**는 실제로 쿼리를 실행하여 실제 타이밍과 행 수를 보여줍니다. 이것들은 느린 쿼리를 진단하는 주요 도구입니다.
EXPLAIN — 계획 (실행 없이)
EXPLAIN orders customer_id ;
**EXPLAIN**은 PostgreSQL의 쿼리 실행 계획(query execution plan) — 쿼리를 어떻게 실행할지(어떤 스캔, 조인, index) — 을 보여줍니다. **EXPLAIN ANALYZE**는 실제로 쿼리를 실행하여 실제 타이밍과 행 수를 보여줍니다. 이것들은 느린 쿼리를 진단하는 주요 도구입니다.
EXPLAIN orders customer_id ;
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 5;
-- 실제로 실행 → 실제 시간, 실제 행, 시간이 어디에 쓰였는지 표시
EXPLAIN (ANALYZE, BUFFERS) SELECT ...; -- 버퍼/캐시 사용도 표시
EXPLAIN ANALYZE는 실제 성능(실제 타이밍, 실제 행 수)을 보여주므로 더 유용합니다 — 추정이 아니라 쿼리가 실제로 시간을 어디에 쓰는지 드러냅니다.
스캔 타입 (가장 중요):
Seq Scan → 전체 테이블 스캔 (모든 행 읽기) — 큰 테이블에서 느림, 흔한 문제
Index Scan → index를 사용해 행 찾기 — 빠름
Index Only Scan → index만 읽기 (테이블 접근 안 함) — 가장 빠름
Bitmap Scan → index 결합 / 많은 매치용
주의할 점:
✗ 필터링되는 큰 테이블의 Seq Scan → 누락된 index 가능성
✗ 추정 행이 실제 행과 매우 다름 → 오래된 통계 (ANALYZE 실행)
✗ 비싼 조인, 디스크로 넘치는 정렬 ("external merge")
✗ 실제 시간이 가장 높은 노드 = 병목
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 5;
-- "Seq Scan on orders ... actual time=120ms" → 전체 스캔, 느림
CREATE INDEX idx_orders_customer ON orders(customer_id);
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 5;
-- "Index Scan using idx_orders_customer ... actual time=0.05ms" → 해결!
EXPLAIN과 EXPLAIN ANALYZE는 PostgreSQL에서 느린 쿼리를 진단하고 최적화하는 필수적인 주요 도구입니다 — 쿼리 성능은 애플리케이션에 중요하고, 이 도구들이 쿼리가 왜 느린지 이해하고 수정을 검증하는 방법이므로, 이를 숙달하는 것은 데이터베이스 성능 작업에 중요한 시니어 수준 지식입니다.
근본 가치는 실행 계획에 대한 가시성입니다. 쿼리가 왜 느린지 추측하는 대신, EXPLAIN ANALYZE(쿼리를 실행하고 실제 타이밍과 행 수를 보여줌)는 Postgres가 그것을 어떻게 실행하고 시간이 어디에 쓰이는지 정확히 드러냅니다.
인식해야 할 가장 중요한 것은 스캔 타입 — 특히 필터링되는 큰 테이블의 **Seq Scan(전체 테이블 스캔)**을 식별하는 것으로, 이는 보통 누락된 index(가장 흔하고 영향력 있는 쿼리 성능 문제)를 나타내며, 빠른 **Index Scan**과 대비됩니다.
계획을 읽는 방법(스캔 타입, 오래된 통계를 발견하기 위한 추정 대 실제 행 비교, 가장 비싼 노드를 병목으로 식별, 디스크로 넘치는 정렬 주의)을 이해하는 것은 쿼리 최적화의 핵심 기술입니다.
진단 워크플로 — EXPLAIN ANALYZE 실행, 병목 식별(흔히 Seq Scan), 수정 적용(보통 index 추가), 재실행하여 검증 — 은 표준적이고 측정 기반인 쿼리 최적화 접근법입니다.
느린 쿼리는 나쁜 데이터베이스 성능의 주요 원인이고, EXPLAIN/EXPLAIN ANALYZE가 이를 진단(누락된 index, 나쁜 계획, 병목 드러내기)하고 최적화를 검증하는 바로 그 도구이므로, 이를 숙달하는 것은 PostgreSQL 성능에 중요하고 가치 높은 지식입니다 — 추측 대신 느린 쿼리를 체계적으로 찾고 수정하는 방법이며, 성능 있는 데이터베이스를 위한 중요한 기술이자 데이터베이스 최적화 작업의 흔한 주제입니다.