Query Optimization
쿼리 실행 비용을 줄이고 성능을 높이기 위한 계획 수립과 라우팅 기법
핵심 개념
쿼리 옵티마이저는 SQL 쿼리의 실행 계획을 생성하고, 가장 효율적인 경로를 선택한다. 정확한 통계 정보가 핵심이며, 대규모 환경에서는 쿼리 라우팅과 워크로드 격리도 중요한 최적화 축이다.
Portable Statistics (PostgreSQL 18)
프로덕션 데이터 없이 정확한 쿼리 플랜을 생성하는 새로운 접근:
- PostgreSQL 18에서 테이블 통계를 내보내고(export) 다른 환경에서 불러올(import) 수 있는 기능 추가
- CI 파이프라인에서 프로덕션 통계를 로드하여 비용이 높은 쿼리를 사전 감지
- 개발 환경에서도 프로덕션과 동일한 쿼리 플랜을 생성 가능
- SQL 실행 라우팅 엔진의 기반 기술로 활용 가능
Trino Gateway — 쿼리 라우팅
Expedia의 대규모 Trino 운영 사례:
- Lyft의 Presto Gateway를 포크한 단일 엔드포인트 프록시
- 분석, ETL, BI 쿼리를 전용 클러스터로 라우팅
- 설정 가능한 규칙 기반 라우팅 (테이블 크기, 쿼리 유형, 소스 도구별)
- Noisy-neighbor 장애 방지, 무중단 배포, 실시간 클러스터 헬스 가시성
PostgreSQL 인덱싱 전략
PostgreSQL의 6가지 인덱스 유형은 워크로드에 따라 극적인 성능 차이를 만든다:
| 인덱스 유형 | 적합한 워크로드 | 특성 |
|---|---|---|
| B-Tree | 범용 (기본값) | O(log n), 100만 행에 20회 비교 |
| Hash | 등가 비교만 | B-Tree보다 컴팩트 |
| BRIN | 시계열/append-only | 극도로 작은 크기, 업데이트 테이블에 부적합 |
| GIN | 배열, JSONB, 전문 검색 | 다중 값 인덱싱에 최적 |
| GiST | 공간 데이터, 범위 쿼리 | R-tree 기반 |
| Partial | 조건부 서브셋 | 크기↓ 유지보수↓ 성능↑ 동시 달성 |
핵심 수치: 인덱스 없이 100만 행 쿼리 265ms/6,369 페이지 → 인덱스 적용 후 0.077ms/4 페이지. 단, 테이블의 15-20% 이상을 반환하는 쿼리에는 무효.
PostgreSQL 18의 Skip Scan으로 복합 인덱스의 선행 컬럼 없이도 최적화 가능.
트레이드오프
| 접근법 | 장점 | 비용 |
|---|---|---|
| Portable Statistics | CI에서 쿼리 플랜 검증, 프로덕션 데이터 불필요 | PostgreSQL 18+ 필요, 통계 동기화 운영 |
| 쿼리 라우팅 (Gateway) | 워크로드 격리, 무중단 배포 | 프록시 레이어 복잡도, 라우팅 규칙 관리 |
| DuckDB 트랜스파일링 | 개발 비용 극감 | 대용량 테이블 풀링 병목 |
연관 개념
- DuckDB — SQL 트랜스파일링으로 비용 절감
- Spark at Scale
- Columnar Execution Engine — C++ 벡터화로 물리적 실행 가속
- Database Concurrency Control — 인덱스 동시성이 쿼리 성능에 미치는 영향
Source: Production Query Plans Without Production Data, Operating Trino at Scale With Trino Gateway, Introduction to PostgreSQL Indexes