데이터 엔지니어 · 데이터 사이언티스트를 위한 핵심 요약
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에서 중간 저장소 없이 분석.
기존 DBMS 대비 설치 간단, 성능 우수, 비용 0. 서버리스 아키텍처에 딱 맞는 선택지입니다. 아래 비교표 참조.
| 기능 | DuckDB | SQLite | PostgreSQL | ClickHouse |
|---|---|---|---|---|
| 설치 | pip install (1분) | 기본 내장 | 서버 설치 | 클러스터 설치 |
| OLAP 성능 (TPC-H SF100) | ~10s | 수시간 | ~1시간 | ~20s |
| 메모리 사용 | 데이터 크기만큼 | 전체 로드 | 인덱스 중심 | 분산 |
| 임베디드 | ✅ | ✅ | ❌ | ❌ |
| Parquet 네이티브 | ✅ | ❌ | 확장 필요 | ✅ |
분석 전용으로 사용. 실시간 쓰기 부하 시 BigQuery나 Snowflake 고려.
DuckDB의 아키텍처는 single-process vector DB입니다. 호스트 앱 → DuckDB 엔진 → 스토리지로 직결. 멀티스레딩 지원하며, persistence는 파일 기반.
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
import duckdb
con = duckdb.connect(':memory:') # 메모리 DB
# or con = duckdb.connect('my.db') # 파일 DB
# 테이블 생성
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,)]
duckdb
D CREATE TABLE test(i INTEGER);
D INSERT INTO test VALUES (42);
D SELECT * FROM test;
┌──────┐
│ i │
│ int32│
├──────┤
│ 42 │
└──────┘
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'; |
SELECT * FROM 's3://bucket/data.parquet' USING parquet; S3 직접 쿼리.df = con.execute("SELECT * FROM read_parquet('file.parquet')").df()SELECT * FROM read_csv_auto('https://example.com/data.csv');원인: 대용량 데이터 전체 로드.
해결: SET memory_limit='16GB'; PRAGMA enable_http_metadata_cache=true; 또는 샘플링 사용.
원인: 복잡 JOIN.
해결: EXPLAIN ANALYZE SELECT ...; 후 LIMIT 추가 또는 threads 증가.
해결: AWS credential 환경변수 설정 후 INSTALL httpfs; LOAD httpfs; SET s3_region='us-east-1';