DuckDB 실무 스터디 가이드

데이터 엔지니어 · 데이터 사이언티스트를 위한 핵심 요약

olap embedded analytics

1. DuckDB란?

DuckDB는 in-process OLAP DBMS로, 애플리케이션 내에서 직접 실행되는 고성능 SQL 엔진입니다. 별도의 서버 프로세스 없이 Python, R, Node.js 등에서 임베디드 방식으로 동작하며, 대용량 분석 쿼리를 초고속으로 처리합니다. columnar storage와 vectorized query execution을 기반으로 설계되어 데이터 사이언스 및 ETL 파이프라인에 최적화되어 있습니다.

🔥 임베디드 실행

별도 서버 없이 호스트 프로세스 내에서 실행. 설치만으로 즉시 사용 가능. 메모리 기반으로 지연 시간 최소화.

⚡ 벡터화 쿼리 처리

SIMD 명령어를 활용한 vectorized execution으로 CPU 코어 효율 극대화. TPC-H 벤치마크에서 PostgreSQL 대비 10~100배 빠름.

📊 다양한 데이터 소스

Parquet, CSV, JSON, HTTP 등 20+ 확장 지원. Pandas DataFrame 직접 쿼리 가능.

실무 적용 예

데이터 사이언티스트가 Jupyter에서 10GB Parquet 파일을 로드해 복잡한 JOIN 쿼리를 1초 만에 실행. ETL에서 중간 저장소 없이 분석.

2. 왜 써야 하는가?

기존 DBMS 대비 설치 간단, 성능 우수, 비용 0. 서버리스 아키텍처에 딱 맞는 선택지입니다. 아래 비교표 참조.

기능 DuckDB SQLite PostgreSQL ClickHouse
설치 pip install (1분) 기본 내장 서버 설치 클러스터 설치
OLAP 성능 (TPC-H SF100) ~10s 수시간 ~1시간 ~20s
메모리 사용 데이터 크기만큼 전체 로드 인덱스 중심 분산
임베디드 ✅ ✅ ❌ ❌
Parquet 네이티브 ✅ ❌ 확장 필요 ✅

주의: DuckDB는 트랜잭션(OLTP)에 약함

분석 전용으로 사용. 실시간 쓰기 부하 시 BigQuery나 Snowflake 고려.

3. 핵심 개념

DuckDB의 아키텍처는 single-process vector DB입니다. 호스트 앱 → DuckDB 엔진 → 스토리지로 직결. 멀티스레딩 지원하며, persistence는 파일 기반.

+-------------------+ +-------------------+ +-------------------+ | Host Process | | DuckDB Engine | | Storage | | (Python/R/etc) |<--->| - Parser |<--->| - .duckdb file | | | | - Planner | | - Parquet/CSV | | - duckdb.connect()| | - Vector Exec | | - HTTP/S3 | +-------------------+ | - Columnar Store | +-------------------+ +-------------------+ | +-------------------+ | Extensions | | - Spatial/Fte | +-------------------+

주요 개념 상세

4. 퀵스타트

1. 설치

Python:

pip install duckdb pandas numpy

CLI (Linux/macOS/Windows):

# 다운로드: https://duckdb.org/docs/installation
wget https://github.com/duckdb/duckdb/releases/latest/download/duckdb_cli-linux-amd64.zip
unzip duckdb_cli-linux-amd64.zip
./duckdb

2. 기본 설정

import duckdb

con = duckdb.connect(':memory:')  # 메모리 DB
# or con = duckdb.connect('my.db')  # 파일 DB

3. 첫 예제

# 테이블 생성
con.execute("""
CREATE TABLE sales (
    id INTEGER,
    product VARCHAR,
    amount DOUBLE,
    date DATE
);
""")

# 데이터 삽입
con.execute("INSERT INTO sales VALUES (1, 'Laptop', 999.99, '2024-01-01');")

# 쿼리
result = con.execute("SELECT SUM(amount) FROM sales;").fetchall()
print(result)  # [(999.99,)]

CLI 예제

duckdb
D CREATE TABLE test(i INTEGER);
D INSERT INTO test VALUES (42);
D SELECT * FROM test;
┌──────┐
│   i  │
│ int32│
├──────┤
│   42 │
└──────┘

5. 핵심 설정 레퍼런스

SET 명령어로 런타임 조정. Python: con.execute("SET key = value")

설정 기본값 설명 예제
memory_limit 80% 최대 메모리 사용량 SET memory_limit='4GB';
threads CPU 코어 수 병렬 스레드 SET threads=8;
max_memory - 절대 메모리 한도 SET max_memory=8589934592; -- 8GB
enable_progress_bar true 쿼리 진행률 표시 SET enable_progress_bar=true;
temp_directory /tmp 임시 파일 경로 SET temp_directory='/ssd/tmp';

6. 실무 팁 & 트러블슈팅

실무 팁

자주 겪는 문제 & 해결

Out of Memory

원인: 대용량 데이터 전체 로드.
해결: SET memory_limit='16GB'; PRAGMA enable_http_metadata_cache=true; 또는 샘플링 사용.

Query Timeout

원인: 복잡 JOIN.
해결: EXPLAIN ANALYZE SELECT ...; 후 LIMIT 추가 또는 threads 증가.

S3 권한 오류

해결: AWS credential 환경변수 설정 후 INSTALL httpfs; LOAD httpfs; SET s3_region='us-east-1';

7. 참고 자료