TechFeedTechFeed
Open Source

DuckDB 실전 가이드 — 서버 없는 인메모리 SQL 분석, Parquet 파이프라인, MCP 에이전트 연동

DuckDB를 실무에 도입하려는 백엔드/데이터 엔지니어를 위한 실전 가이드. 설치부터 Parquet·S3 쿼리, Pandas/Polars 제로카피 연동, MCP 서버로 AI 에이전트와 연결하기, DuckLake ACID 레이크하우스 운용까지 실제 동작하는 코드 중심으로 정리한다.

DuckDB는 별도 서버 없이 프로세스 내에서 SQL 분석 쿼리를 실행하는 인메모리 OLAP 데이터베이스다. Python 한 줄로 임포트하고, Parquet·CSV·JSON 파일을 직접 쿼리하며, Pandas/Polars와 제로카피로 연동된다. 2026년 현재 AI 데이터 파이프라인, 로컬 분석, 엣지 분석 영역에서 빠르게 표준이 되고 있다.

이 글은 DuckDB를 실무에 도입하려는 백엔드/데이터 엔지니어와 AI 워크플로우를 구축하는 개발자를 위한 실전 가이드다. 설치부터 Parquet 파이프라인, MCP 서버 연동, DuckLake 프로덕션 운용까지 실제 동작하는 코드 중심으로 정리한다.

DuckDB analytics database workflow diagram
DuckDB는 프로세스 내에서 동작하는 OLAP 엔진으로, 서버 없이 Parquet과 CSV를 직접 쿼리한다

왜 지금 DuckDB인가

기존 분석 데이터베이스(Spark, ClickHouse, BigQuery)는 대규모 클러스터가 필요하거나, 원격 서버 비용이 발생한다. DuckDB는 프로세스 내부에서 직접 실행되므로 인프라 없이 노트북·CI 환경·서버리스 함수에서도 동작한다.

  • zero infrastructure: pip install duckdb 한 줄로 완료
  • Parquet 직접 쿼리: 원격 S3 Parquet도 읽을 수 있음
  • 벡터화 실행 엔진: 컬럼 지향 처리로 Pandas보다 수십 배 빠른 집계
  • AI 워크플로우 친화: MCP 서버로 LLM이 자연어로 DuckDB 쿼리 가능
  • DuckLake: ACID 트랜잭션 + Iceberg 호환 레이크하우스 포맷 (2025년 출시)

2026년 현재 Meta, Google, Airbnb, Patreon 등이 DuckDB를 프로덕션에 사용하고 있으며, GitHub Star 24,000+를 기록 중이다.

설치 및 기본 사용법

DuckDB는 Python, Node.js, Go, Java, R 등 다양한 언어 바인딩을 지원한다. Python 기준으로 설명한다.

DuckDB 설치 및 기본 쿼리
pip install duckdb import duckdb # 인메모리 DB 연결 con = duckdb.connect() # CSV 직접 쿼리 (파일 로드 불필요) result = con.execute(""" SELECT category, COUNT(*) as cnt, AVG(price) as avg_price FROM 'data/products.csv' GROUP BY category ORDER BY cnt DESC """).fetchdf() print(result) # 영구 DB 파일 사용 con = duckdb.connect('analytics.duckdb')

Parquet 파이프라인 실전

DuckDB의 핵심 강점은 Parquet 파일을 로컬/S3에서 직접 쿼리하는 능력이다. Hive 파티셔닝도 자동으로 인식한다.

Parquet 직접 쿼리 및 파티셔닝
import duckdb con = duckdb.connect() # S3 Parquet 직접 쿼리 (boto3 불필요) con.execute("INSTALL httpfs; LOAD httpfs;") con.execute(""" SET s3_region='ap-northeast-2'; SET s3_access_key_id='YOUR_KEY'; SET s3_secret_access_key='YOUR_SECRET'; """) result = con.execute(""" SELECT year, month, SUM(revenue) as total FROM 's3://my-bucket/sales/year=*/month=*/*.parquet' WHERE year >= 2025 GROUP BY year, month ORDER BY year, month """).fetchdf() # Hive 파티셔닝으로 내보내기 con.execute(""" COPY ( SELECT * FROM result_table ) TO 'output/' ( FORMAT PARQUET, PARTITION_BY (year, month), OVERWRITE_OR_IGNORE 1 ) """)
DuckDB Parquet pipeline and S3 integration
DuckDB는 S3 Parquet 파일을 다운로드 없이 직접 SQL로 쿼리할 수 있다

Pandas / Polars 제로카피 연동

DuckDB는 Pandas DataFrame과 Polars DataFrame을 데이터 복사 없이 SQL로 쿼리할 수 있다. Arrow 메모리 포맷을 공유하기 때문에 변환 오버헤드가 없다.

Pandas / Polars 제로카피 쿼리
import duckdb import pandas as pd import polars as pl con = duckdb.connect() # Pandas DataFrame을 SQL로 직접 쿼리 df_pd = pd.DataFrame({ 'user_id': [1, 2, 3, 4, 5], 'event': ['click', 'purchase', 'click', 'view', 'purchase'], 'amount': [0, 29.9, 0, 0, 49.9] }) result = con.execute(""" SELECT event, COUNT(*) as cnt, SUM(amount) as revenue FROM df_pd GROUP BY event """).fetchdf() # Polars로 출력 result_pl = con.execute(""" SELECT * FROM df_pd WHERE amount > 0 """).pl() # Polars DataFrame으로 반환 # 벡터화 UDF 등록 def categorize(amount: float) -> str: return 'paid' if amount > 0 else 'free' con.create_function('categorize', categorize, ['DOUBLE'], 'VARCHAR') con.execute("SELECT user_id, categorize(amount) FROM df_pd").fetchdf()
성능 기준 (참고)
DuckDB는 GROUP BY + 집계 쿼리에서 Pandas보다 평균 10~30배, 경우에 따라 100배 이상 빠른 결과가 보고된다. 단, 행 단위 순회나 소규모 데이터는 Pandas가 더 간편하다.

MCP 서버 연동 — AI 에이전트가 DuckDB를 쿼리하게 하기

2025년 DuckDB 공식 MCP 서버가 출시되면서 Claude, GPT-4o, 로컬 LLM 등 AI 에이전트가 자연어로 DuckDB를 쿼리할 수 있게 됐다. 데이터 분석 에이전트 구축에 핵심 인프라가 된다.

DuckDB MCP 서버 설정 (Claude Code / Claude Desktop)
# DuckDB MCP 서버 설치 npx @duckdb/duckdb-mcp --help # Claude Desktop용 claude_desktop_config.json { "mcpServers": { "duckdb": { "command": "npx", "args": [ "-y", "@duckdb/duckdb-mcp", "--db-path", "/path/to/analytics.duckdb" ] } } } # Claude Code 프로젝트 MCP (.mcp.json) { "mcpServers": { "duckdb": { "command": "npx", "args": ["-y", "@duckdb/duckdb-mcp", "--db-path", "./analytics.duckdb"] } } }

설정 후 Claude에게 "지난 30일 매출을 카테고리별로 집계해줘"라고 하면 DuckDB를 직접 쿼리해 결과를 반환한다. RAG 파이프라인의 벡터 스토어와 DuckDB를 결합하면 구조화 데이터와 비구조화 데이터를 하나의 에이전트로 처리할 수 있다.

DuckDB MCP server AI agent integration
DuckDB MCP 서버를 통해 AI 에이전트가 자연어로 데이터베이스를 직접 쿼리할 수 있다

DuckLake — ACID 레이크하우스 프로덕션 운용

DuckLake는 2025년 출시된 DuckDB 기반 레이크하우스 포맷으로, Delta Lake·Apache Iceberg와 동일한 ACID 트랜잭션을 단일 서버에서 구현한다.

  • 시간 여행 쿼리: SELECT * FROM table AT VERSION 42
  • 전체 DML 지원: INSERT, UPDATE, DELETE, MERGE
  • Iceberg 호환: Spark, Trino 등에서 DuckLake 데이터를 직접 읽기 가능
  • 스냅샷 관리: CHECKPOINT 명령으로 오래된 버전 정리
DuckLake 설정 및 사용
# DuckLake 확장 설치 import duckdb con = duckdb.connect('warehouse.duckdb') con.execute("INSTALL ducklake; LOAD ducklake;") # 레이크하우스 생성 con.execute(""" ATTACH 'ducklake:data/catalog.db?data_path=data/lake/' AS lake """) # 테이블 생성 및 INSERT con.execute(""" CREATE TABLE lake.sales ( order_id BIGINT, product VARCHAR, amount DOUBLE, created_at TIMESTAMP ) """) con.execute("INSERT INTO lake.sales VALUES (1, 'Widget', 29.9, NOW())") # 시간 여행 쿼리 con.execute(""" SELECT * FROM lake.sales AT (VERSION => 1) """).fetchdf() # 스냅샷 체크포인트 (오래된 버전 정리) con.execute("CHECKPOINT lake")

프로덕션 성능 최적화 팁

DuckDB를 프로덕션 분석 파이프라인에 투입할 때 성능에 직결되는 설정이다.

DuckDB 프로덕션 성능 설정
import duckdb con = duckdb.connect('analytics.duckdb', config={ 'threads': 8, # CPU 코어 수에 맞게 조정 'memory_limit': '4GB', # 메모리 상한 설정 'temp_directory': '/fast-ssd', # 스필 디렉토리는 SSD로 'preserve_insertion_order': False # 집계 성능 향상 }) # 쿼리 프로파일링 con.execute("PRAGMA enable_profiling='json'") con.execute("PRAGMA profiling_output='/tmp/profile.json'") # 느린 쿼리 분석 con.execute("EXPLAIN ANALYZE SELECT ...") # JSON 분석 가속 (DuckDB 1.5+ VARIANT 타입) con.execute(""" CREATE TABLE events AS SELECT id, payload::JSON as payload FROM 'events.json' """)
주의: 멀티 프로세스 동시 쓰기
DuckDB는 단일 프로세스에서 다중 스레드를 지원하지만, 여러 프로세스가 동시에 같은 DB 파일에 쓰는 것은 지원하지 않는다. 프로덕션에서 쓰기 경합이 예상된다면 MotherDuck(클라우드 서비스)이나 DuckLake를 고려할 것.

DuckDB vs Pandas vs Polars — 언제 무엇을 쓰나

DuckDB vs Pandas vs Polars performance comparison
DuckDB는 SQL 기반 집계와 파일 직접 쿼리에서 특히 강점을 보인다
DuckDBParquet데이터분석인메모리DBMCPDuckLakePythonPandasPolars데이터파이프라인

관련 포스트

OpenAI Astral 인수 — Python 개발 도구 생태계가 재편된다2026-03-23Claw Code — Claude Code 클린룸 재구현, 72K 스타 오픈소스 AI 코딩 에이전트 프레임워크2026-04-03ElysiaJS 실전 튜토리얼 — Bun 기반 TypeScript API 서버, JWT 인증, Swagger 문서화, Docker 배포2026-04-25Temporal.io 워크플로우 튜토리얼 — TypeScript로 분산 작업 큐와 장기 실행 프로세스 구현2026-04-19