Skip to content
Go back

[DB] explaing 활용한 SQL 쿼리플래너,옵티마이저 이해

Edit page

쿼리 플래너와 옵티마이저란?

Postgres의 쿼리 플래너는 입력된 SQL 쿼리를 해석하고 가능한 여러 실행 계획을 도출한다. 그 후, 쿼리 옵티마이저는 각 실행 계획의 예상 비용(cost)을 계산해 가장 효율적인 실행 계획을 선택한다. 이 과정은 인덱스 사용, 조인 순서, 서브쿼리 변환 등 다양한 최적화 기법을 포함한다.


EXPLAIN 명령어의 기본 사용법

Postgres에서 EXPLAIN 명령어를 사용하면 쿼리 실행 계획을 미리 볼 수 있다. 예를 들어:

EXPLAIN SELECT * FROM posts WHERE likes > 100;

이 명령어는 쿼리 실행 단계, 예상 비용, 예상 행 수 등을 출력하여 쿼리의 성능 병목 지점을 파악할 수 있도록 해준다.


EXPLAIN 출력 결과 주요 항목

EXPLAIN 출력 결과에서 중요한 항목은 다음과 같다:

rows: 예상 행수

width: 행의 폭과 전송 비용

cost: 실행 비용과 초기 시간


성능 개선: count(*) vs. 행 통계 활용

게시물의 좋아요 수와 같이 대략적인 카운트가 필요한 경우, 정확한 count(*) 연산 대신 테이블 통계(예: pg_class의 통계 정보)나 EXPLAIN의 rows 추정치를 활용할 수 있다.

이러한 방법은 대규모 데이터셋에서 성능 개선에 큰 도움을 줄 수 있다.


ORDER BY, 통계 함수와 cost 변화

ORDER BY 절이나 통계 함수(AVG, SUM, COUNT 등)를 사용하면 쿼리 실행 과정에서 추가적인 정렬과 계산이 필요하다. 이로 인해:

따라서, 쿼리 작성 시 불필요한 ORDER BY나 통계 함수 사용을 피하고, 필요한 경우 인덱스 최적화나 쿼리 리팩토링을 통해 비용을 최소화하는 것이 중요하다.


실제 예제: Postgres EXPLAIN 사용법

다음은 Postgres에서 EXPLAIN 명령어를 사용하여 쿼리 실행 계획을 분석하는 예제이다.

예제 1: 단순 SELECT 쿼리

EXPLAIN SELECT id, title, likes FROM posts WHERE likes > 100;

출력 예시:

Seq Scan on posts  (cost=0.00..35.50 rows=150 width=24)
  Filter: (likes > 100)

예제 2: ORDER BY와 통계 함수 사용

EXPLAIN ANALYZE SELECT AVG(likes) FROM posts WHERE created_at > '2025-01-01';

출력 예시:

Aggregate  (cost=50.00..50.01 rows=1 width=8) (actual time=1.234..1.235 rows=1 loops=1)
  ->  Seq Scan on posts  (cost=0.00..45.00 rows=2000 width=4) (actual time=0.045..0.567 rows=2100 loops=1)
        Filter: (created_at > '2025-01-01'::timestamp)

결론 🎯

Postgres에서 EXPLAIN 명령어를 활용하면 SQL 쿼리의 실행 계획과 예상 비용, 행 수, 데이터 폭 등을 미리 파악할 수 있다.

이와 같은 분석을 통해 쿼리의 병목 지점을 식별하고, 효율적인 인덱스 설계와 쿼리 리팩토링을 통해 데이터베이스 성능을 크게 개선할 수 있다.


Edit page
Share this post on:

Previous Post
[Spring🌱] Supabase PostgreSQL Transaction Pooler 에러 해결하기
Next Post
[DB] 비트맵 인덱스 스캔 vs 인덱스 스캔 vs 테이블 스캔