본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

DuckDB — DB 서버 없이 파일에 SQL

~12 min · duckdb, sql, olap

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

분석용 SQLite

DuckDB 는 in-process 로 도는 OLAP SQL 데이터베이스야. 핵심은 이거야: pip install duckdb 하고 SQL 을 적으면 Parquet 파일, Arrow 테이블, Pandas DataFrame, Polars DataFrame, CSV 를 그대로 query 해 — 복사 없이, 서버에 올리는 일 없이. 지금 stable 은 1.5.5.

SQLite 가 트랜잭션 중심 row-oriented 작업용 in-process DB 라면, DuckDB 는 분석 중심 column-oriented 작업용 in-process DB 야. 같은 아이디어 — 서버 없음, Python 프로세스 안에서 — 를 다른 과녁에 겨눈 거지.

잘하는 것

  • Parquet 파일을 column pruning + predicate pushdown 까지 알아서 챙겨 가며 query.
  • Parquet 파일 여러 개를 테이블처럼 join.
  • SQL 이 더 명확한 transformation 일 때 Pandas/Polars DataFrame 을 SQL 로 처리.
  • 수백 GB 규모 분석 "warehouse" 역할 — Snowflake 를 띄우는 게 과할 때.

아닌 것

DuckDB 는 동시 접속 몰리는 OLTP 용이 아니야 (그건 Postgres). 분산 시스템도 아니고 (수십 노드 페타바이트면 BigQuery/Snowflake/Spark). 그리고 읽기 중심 분석에 최적화돼 있어서 row 를 한 건씩 흘려 넣는 자리가 아니야 — 넣을 땐 batch 로.

Code

세 패턴: 파일 query, DataFrame query, DB 파일에 persist·python
import duckdb
import pandas as pd

# 1. Parquet 직접 query — DataFrame 메모리에 안 로드
result = duckdb.sql('''
    SELECT date_trunc('month', order_date) AS month,
           SUM(amount_usd) AS revenue
    FROM 'warehouse/orders/year=2026/month=*/*.parquet'
    GROUP BY 1 ORDER BY 1
''').to_df()

# 2. Pandas DataFrame 을 테이블처럼 query
df = pd.read_parquet('customers.parquet')
by_country = duckdb.sql('''
    SELECT country, COUNT(*) AS n FROM df GROUP BY 1 ORDER BY n DESC
''').to_df()

# 3. DuckDB 파일에 persist — 분석용 SQLite 처럼
con = duckdb.connect('analytics.duckdb')
con.sql('''
    CREATE OR REPLACE TABLE monthly_revenue AS
    SELECT date_trunc('month', order_date) AS month,
           SUM(amount_usd) AS revenue
    FROM 'warehouse/orders/year=2026/month=*/*.parquet'
    GROUP BY 1
''')
con.close()

External links

Exercise

100MB 넘는 Parquet 파일 (또는 partitioned Parquet 디렉토리) 을 골라. 같은 monthly-revenue (또는 그에 준하는) query 를 세 가지로 짜 봐: pd.read_parquet + groupby, pl.scan_parquet + group_by, duckdb.sql(...). 각각 시간을 재. 보통 DuckDB 가 이기고, SQL 이 제일 읽기 좋다는 걸 알게 될 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.