DuckDB 사용법 총정리 — SQL로 CSV·JSON 즉시 분석
매출 데이터가 담긴 CSV 파일 하나를 분석해야 하는 상황을 떠올려 보세요. 엑셀을 열면 10만 행이 넘어가는 순간 버벅거리기 시작합니다. pandas를 쓰자니 Python 환경부터 꾸려야 하고, 별도 데이터베이스 서버를 올리기엔 너무 과합니다. 이럴 때 DuckDB를 설치하고 터미널에서 SQL 한 줄만 입력하면 어떨까요?
duckdb -c "SELECT region, SUM(amount) FROM 'sales.csv' GROUP BY region ORDER BY 2 DESC"
DuckDB는 이 질문에 대한 가장 깔끔한 답입니다. 서버 설치도, 데몬 프로세스도, 네트워크 설정도 필요 없습니다. 내 컴퓨터 안에서 돌아가는 초경량 분석 엔진이 CSV·JSON·Parquet 파일을 마치 데이터베이스 테이블처럼 SQL로 직접 쿼리합니다. 2024년부터 폭발적으로 성장해 2026년 현재 GitHub 스타 3만 5천 개를 넘긴 이 프로젝트가, 데이터 분석 방식을 조용히 바꾸고 있습니다.
이 글에서는 DuckDB를 처음 설치하는 방법부터 파일을 SQL로 즉시 분석하는 기본기, 여러 파일을 결합하는 고급 기법, Python 연동, 실무 활용 시나리오까지 한 번에 정리합니다. SQL을 조금이라도 아는 분이라면 5분 안에 첫 분석을 돌릴 수 있습니다.

DuckDB란 무엇인가 — 설치 없는 인프로세스 분석 엔진
DuckDB를 한 마디로 설명하면 “분석용 SQLite”입니다. SQLite가 가벼운 임베디드 트랜잭션 데이터베이스라면, DuckDB는 가벼운 임베디드 분석 데이터베이스입니다. 두 프로젝트의 공통점은 명확합니다. 별도 서버 프로세스가 필요 없고, 하나의 파일(또는 인메모리)으로 동작하며, 설치가 극도로 간단합니다.
하지만 설계 철학은 정반대입니다. SQLite는 한 행씩 읽고 쓰는 OLTP(온라인 트랜잭션 처리)에 최적화되어 있습니다. DuckDB는 수백만 행을 한꺼번에 스캔하는 OLAP(온라인 분석 처리)에 최적화되어 있습니다. 이 차이가 만드는 실무적 결과는 극적입니다.
- 컬럼 기반 저장: 행이 아니라 열 단위로 데이터를 읽기 때문에,
SELECT SUM(amount) FROM sales같은 집계 쿼리가 행 기반 대비 수십 배 빠릅니다. - 벡터화 실행 엔진: CPU의 SIMD 명령어를 활용해 한 번에 수천 개의 값을 병렬 처리합니다. 최신 CPU의 성능을 끝까지 뽑아냅니다.
- 자동 파일 읽기: CSV, JSON, Parquet, Excel 파일의 경로만 넘기면 스키마를 자동 추론해서 SQL 테이블로 노출합니다.
CREATE TABLE이나LOAD DATA같은 사전 작업이 전혀 필요 없습니다. - 제로 디펜던시: 단일 바이너리 또는 단일 Python 패키지. JVM도, Docker도, 외부 라이브러리도 필요 없습니다.
전통적인 데이터베이스(PostgreSQL, MySQL)는 서버를 설치하고, 포트를 열고, 사용자를 만들고, 테이블을 정의한 다음에야 쿼리를 돌릴 수 있습니다. DuckDB는 이 모든 단계를 건너뜁니다. 파일이 곧 데이터베이스이고, 쿼리가 곧 분석입니다.
설치 — 세 줄이면 끝
DuckDB의 설치는 놀라울 정도로 간단합니다. 자신의 환경에 맞는 방법 하나만 택하면 됩니다.
방법 1: CLI 단독 설치 (가장 빠름)
터미널에서 SQL을 바로 실행하고 싶다면 CLI 바이너리만 받으면 됩니다.
Windows (winget):
winget install DuckDB.cli
macOS (Homebrew):
brew install duckdb
Linux:
공식 사이트(duckdb.org)에서 바이너리를 받아 PATH에 넣거나, 패키지 매니저가 지원하는 배포판이라면 해당 명령을 사용합니다. 압축 파일 하나를 받아 풀면 실행 파일이 바로 나오기 때문에 별도 인스톨러가 필요 없습니다.
설치 확인은 간단합니다.
duckdb --version
버전 번호가 출력되면 준비 완료입니다.
방법 2: Python 패키지 (분석 워크플로우 통합)
Python 환경에서 pandas, Jupyter와 함께 쓰고 싶다면 pip 한 줄이면 됩니다.
pip install duckdb
설치 용량은 약 30MB. C++ 네이티브 확장이라 별도 컴파일이 필요 없는 휠(wheel)로 배포됩니다. Python 3.8 이상이면 Windows·macOS·Linux 모두 지원합니다. uv를 사용한다면 uv pip install duckdb로 더 빠르게 설치할 수 있습니다.
방법 3: Node.js·Java·R·Rust 등
DuckDB는 거의 모든 주요 언어에 바인딩을 제공합니다. Node.js는 npm install duckdb, R은 install.packages("duckdb")로 설치합니다. 이 글에서는 CLI와 Python을 중심으로 설명하지만, 다른 언어에서도 사용법은 거의 동일합니다.
실전 기초 — CSV 파일을 SQL로 바로 분석하기
설치를 마쳤으면 바로 실습해 봅시다. 아래와 같은 sales.csv 파일이 있다고 가정합니다.
date,region,product,amount,quantity
2026-01-15,서울,노트북,1500000,3
2026-01-16,부산,태블릿,800000,5
2026-01-16,서울,모니터,450000,2
2026-02-01,대구,노트북,1500000,1
2026-02-03,서울,태블릿,800000,4
2026-02-10,부산,노트북,3000000,2
파일을 직접 쿼리하기
DuckDB CLI를 열고(duckdb 명령어 실행) 다음 한 줄을 입력합니다.
SELECT * FROM 'sales.csv' LIMIT 5;
이게 전부입니다. CREATE TABLE도, COPY도, 스키마 정의도 필요 없습니다. DuckDB가 파일의 첫 몇 줄을 읽어 컬럼 이름과 데이터 타입을 자동으로 추론합니다. 날짜 컬럼은 DATE로, 숫자 컬럼은 BIGINT나 DOUBLE로, 문자열은 VARCHAR로 알아서 잡아줍니다.
CLI를 띄우지 않고 셸에서 바로 결과를 보고 싶다면 -c 플래그를 씁니다.
duckdb -c "SELECT * FROM 'sales.csv' LIMIT 5"

집계·정렬·필터 — 익숙한 SQL 그대로
지역별 매출 합계를 구하고 싶다면:
SELECT region,
SUM(amount) AS total_sales,
SUM(quantity) AS total_qty
FROM 'sales.csv'
GROUP BY region
ORDER BY total_sales DESC;
2026년 2월 데이터만 보고 싶다면:
SELECT * FROM 'sales.csv'
WHERE date BETWEEN '2026-02-01' AND '2026-02-28'
ORDER BY amount DESC;
제품별 평균 단가를 계산하고 싶다면:
SELECT product,
ROUND(AVG(amount / quantity), 0) AS avg_unit_price,
COUNT(*) AS transaction_count
FROM 'sales.csv'
GROUP BY product;
SQL을 아는 분이라면 새로 배울 게 거의 없습니다. FROM 절에 테이블 이름 대신 파일 경로를 넣는 것만 다릅니다. WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, 서브쿼리, 윈도우 함수까지 표준 SQL이 그대로 작동합니다.
JSON·Parquet·Excel — 같은 방식으로 분석
DuckDB의 진가는 CSV 이상의 포맷을 동일한 방식으로 다룰 수 있다는 점에서 드러납니다.
JSON 파일
API 응답을 저장한 JSON 배열 파일이 있다면:
-- users.json: [{"id": 1, "name": "김철수", "age": 32}, ...]
SELECT name, age FROM 'users.json' WHERE age >= 30;
NDJSON(Newline Delimited JSON, 줄마다 JSON 객체 하나) 형식도 자동 감지합니다. 서버 로그나 스트리밍 데이터 저장에 흔히 쓰이는 포맷이죠.
-- access.ndjson 형태의 로그 파일
SELECT path, COUNT(*) AS hits,
ROUND(AVG(response_time_ms), 1) AS avg_ms
FROM 'access.ndjson'
GROUP BY path
ORDER BY hits DESC;
Parquet — 빅데이터의 사실상 표준 포맷
Parquet는 Apache에서 만든 컬럼 기반 바이너리 포맷입니다. CSV 대비 파일 크기가 5분의 1에서 10분의 1 수준이고, 필요한 컬럼만 선택적으로 읽을 수 있어 대용량 분석에서 압도적으로 유리합니다. AWS S3, Google BigQuery, Snowflake 등 거의 모든 데이터 플랫폼이 Parquet를 기본 포맷으로 지원합니다.
DuckDB에서 Parquet 분석은 CSV와 완전히 동일합니다.
SELECT category, SUM(revenue)
FROM 'analytics_2026.parquet'
GROUP BY category;
1GB짜리 Parquet 파일도 수 초 안에 집계 결과가 나옵니다. 같은 크기의 CSV라면 수십 초가 걸리는 작업입니다. 컬럼 기반 엔진과 컬럼 기반 포맷의 궁합이 만드는 성능 차이입니다.
Excel 파일
Excel(xlsx) 파일도 확장을 설치하면 바로 쿼리할 수 있습니다.
INSTALL spatial;
LOAD spatial;
SELECT * FROM st_read('report.xlsx', layer='Sheet1') LIMIT 10;
다만 Excel은 데이터 분석보다는 보고서 포맷에 가깝기 때문에, 가능하다면 CSV나 Parquet로 먼저 변환한 뒤 분석하는 것이 속도와 안정성 면에서 더 낫습니다.
여러 파일을 한 번에 — 글로브 패턴과 JOIN
실무에서는 데이터가 한 파일에 깔끔하게 들어 있는 경우가 드뭅니다. 월별로 분리된 CSV, 시스템별로 나뉜 로그, 서로 다른 형식의 마스터 데이터와 트랜잭션 데이터를 결합해야 하는 상황이 대부분이죠. DuckDB는 이런 시나리오를 놀라울 정도로 자연스럽게 처리합니다.
글로브 패턴으로 다중 파일 읽기
월별 매출 파일이 sales_2026_01.csv, sales_2026_02.csv 형태로 나뉘어 있다면:
SELECT * FROM 'sales_2026_*.csv';
와일드카드 하나로 모든 파일을 합쳐서 읽습니다. 각 파일의 컬럼 구조가 동일하기만 하면 됩니다. 어떤 파일에서 온 행인지 구분하고 싶다면 filename 가상 컬럼을 활용합니다.
SELECT filename, COUNT(*) AS row_count
FROM 'sales_2026_*.csv'
GROUP BY filename;
하위 폴더까지 재귀적으로 읽으려면 ** 패턴을 씁니다.
SELECT * FROM 'data/**/*.parquet';
서로 다른 파일끼리 JOIN
매출 데이터(CSV)에 고객 정보(JSON)를 결합하는 것도 SQL 한 방입니다.
SELECT s.date, s.amount, c.name, c.tier
FROM 'sales.csv' s
JOIN 'customers.json' c ON s.customer_id = c.id
WHERE c.tier = 'VIP'
ORDER BY s.amount DESC;
CSV와 JSON이라는 완전히 다른 포맷의 파일을 마치 같은 데이터베이스의 테이블처럼 조인합니다. Parquet와 CSV를 섞어 조인하는 것도 물론 됩니다. 이 자유로움이 DuckDB를 단순한 CSV 뷰어와 차별화하는 핵심 기능입니다.
분석 결과 내보내기
분석 결과를 다시 파일로 저장하는 것도 SQL입니다.
-- CSV로 내보내기
COPY (
SELECT region, SUM(amount) AS total
FROM 'sales_2026_*.csv'
GROUP BY region
) TO 'region_summary.csv' (HEADER, DELIMITER ',');
-- Parquet로 내보내기 (대용량이면 이쪽이 유리)
COPY (
SELECT * FROM 'raw_logs.csv' WHERE status >= 400
) TO 'error_logs.parquet' (FORMAT PARQUET);
-- JSON으로 내보내기
COPY (
SELECT * FROM 'sales.csv' LIMIT 100
) TO 'sample.json' (FORMAT JSON, ARRAY true);
CSV에서 Parquet로의 변환, JSON에서 CSV로의 변환, 필터링 후 저장 등 데이터 파이프라인의 기본 작업을 별도 스크립트 없이 SQL만으로 해결합니다. 특히 CSV를 Parquet로 변환하면서 ZSTD 압축을 적용하면 원본 대비 파일 크기가 8분의 1에서 10분의 1로 줄어들면서도 쿼리 속도는 오히려 빨라집니다.

Python 연동 — pandas를 보완하는 최강 조합
DuckDB의 CLI만으로도 많은 일을 할 수 있지만, Python과 결합하면 활용 범위가 한 단계 넓어집니다. 특히 pandas DataFrame과의 상호 변환이 매끄럽다는 점이 결정적 강점입니다.
기본 사용법
import duckdb
# 파일 직접 쿼리
result = duckdb.sql("SELECT region, SUM(amount) FROM 'sales.csv' GROUP BY region")
print(result)
# 인메모리 데이터베이스에 테이블 생성
con = duckdb.connect() # :memory: 가 기본
con.execute("CREATE TABLE metrics AS SELECT * FROM 'metrics.parquet'")
row = con.execute(
"SELECT AVG(latency_ms) FROM metrics WHERE endpoint = '/api/users'"
).fetchone()
print(row)
pandas DataFrame과 상호 변환
import pandas as pd
import duckdb
# pandas DataFrame을 DuckDB에서 직접 쿼리
df = pd.read_csv('sales.csv')
result = duckdb.sql("SELECT region, SUM(amount) FROM df GROUP BY region")
# DuckDB 쿼리 결과를 DataFrame으로 변환
summary_df = duckdb.sql("""
SELECT product,
COUNT(*) AS cnt,
AVG(amount) AS avg_amount
FROM 'sales.csv'
GROUP BY product
""").df() # .df()로 바로 DataFrame 변환
print(summary_df)
여기서 주목할 점은 FROM df 부분입니다. Python 변수에 담긴 pandas DataFrame을 SQL의 FROM 절에 변수명 그대로 넣을 수 있습니다. 별도의 등록이나 변환 과정이 필요 없습니다. 반대로 .df() 메서드 한 번이면 DuckDB 쿼리 결과가 곧바로 pandas DataFrame이 됩니다.
대용량 데이터에서 pandas보다 빠른 이유
pandas는 모든 데이터를 메모리에 올린 다음 처리합니다. 8GB RAM 머신에서 6GB짜리 CSV를 열면 메모리 부족으로 프로세스가 죽습니다. DuckDB는 다릅니다.
- 스트리밍 처리: 전체 데이터를 메모리에 올리지 않고, 필요한 만큼만 청크 단위로 읽어 처리합니다. 물리 메모리보다 큰 파일도 분석할 수 있습니다.
- 컬럼 선택 푸시다운:
SELECT name, age FROM ...처럼 특정 컬럼만 요청하면, 해당 컬럼의 데이터만 디스크에서 읽습니다. pandas는 전체 컬럼을 먼저 읽은 뒤 필요 없는 걸 버립니다. - 멀티스레드 병렬 처리: CPU 코어를 자동으로 활용합니다. pandas의 대부분 연산은 싱글스레드입니다.
- 필터 푸시다운:
WHERE status = 'error'조건이 있으면 파일 읽기 단계에서 이미 걸러냅니다. 불필요한 행은 아예 메모리에 올라오지 않습니다.
벤치마크에 따르면 1GB 이상의 CSV 파일에서 집계 쿼리를 돌릴 때 DuckDB가 pandas 대비 5배에서 20배 빠릅니다. 10GB 이상에서는 pandas가 메모리 부족으로 실행조차 불가능한 반면 DuckDB는 정상적으로 결과를 반환합니다.
그렇다고 pandas를 버리라는 이야기가 아닙니다. pandas는 데이터 전처리, 시각화 연동, 머신러닝 파이프라인 통합에서 여전히 강력합니다. 최적의 조합은 DuckDB로 대용량 데이터를 필터·집계한 뒤, 축소된 결과를 pandas DataFrame으로 받아 후처리하는 것입니다.
실무에서 바로 쓰는 DuckDB 활용 시나리오 5가지
DuckDB의 문법은 이해했으니, 실제로 어디에 쓸 수 있는지 구체적인 시나리오를 살펴봅시다.
1. 서버 로그 즉석 분석
nginx나 애플리케이션 로그가 JSON 형태로 쌓이고 있다면, 별도 ELK 스택 없이도 즉석 분석이 가능합니다.
-- 오늘 가장 많이 호출된 API 엔드포인트 Top 10
SELECT path, COUNT(*) AS hits,
ROUND(AVG(response_time_ms), 1) AS avg_ms
FROM 'logs/access_2026-06-*.ndjson'
WHERE status BETWEEN 200 AND 299
GROUP BY path
ORDER BY hits DESC
LIMIT 10;
장애 상황에서 “지난 1시간 동안 500 에러가 가장 많이 발생한 엔드포인트가 뭐지?” 같은 질문에 CLI 한 줄로 답을 얻을 수 있습니다. Kibana 대시보드를 열 시간도 없는 긴급 상황에서 특히 유용합니다.
2. 마케팅 캠페인 데이터 크로스 분석
광고 플랫폼(Google Ads, Meta, 네이버 등)에서 각각 내려받은 CSV 파일 여러 개를 합쳐 채널별 ROI를 한 눈에 비교합니다.
SELECT source,
SUM(spend) AS total_spend,
SUM(conversions) AS total_conv,
ROUND(SUM(revenue) / NULLIF(SUM(spend), 0), 2) AS roas
FROM 'campaigns/*.csv'
GROUP BY source
HAVING SUM(spend) > 100000
ORDER BY roas DESC;
엑셀에서 VLOOKUP과 피벗 테이블을 조합해 한 시간 걸리던 작업이 SQL 몇 줄로 끝납니다.
3. IoT 센서 데이터 이상 탐지
공장이나 서버실의 온도·습도 센서가 Parquet로 데이터를 쌓고 있다면, 통계적 이상치를 빠르게 찾아냅니다.
WITH stats AS (
SELECT AVG(temperature) AS avg_temp,
STDDEV(temperature) AS std_temp
FROM 'sensor_data_2026_06.parquet'
)
SELECT sensor_id, timestamp, temperature
FROM 'sensor_data_2026_06.parquet', stats
WHERE temperature > avg_temp + 3 * std_temp
ORDER BY timestamp;
4. 데이터 포맷 변환 파이프라인
협업 부서에서 받은 Excel·CSV·JSON 파일을 표준 Parquet으로 통일하는 작업을 한 줄로 처리합니다.
COPY (
SELECT *, filename AS source_file
FROM 'incoming/*.csv'
) TO 'consolidated/all_data.parquet'
(FORMAT PARQUET, COMPRESSION ZSTD);
Python 변환 스크립트를 짜거나, Apache Spark 클러스터를 세팅할 필요가 없습니다. 수 GB 규모까지는 DuckDB 단독으로 충분히 처리합니다.
5. 프로토타입 대시보드 백엔드
사이드 프로젝트나 PoC 단계에서 PostgreSQL을 세팅하기 전에, DuckDB 파일 하나로 대시보드의 데이터 소스를 만들 수 있습니다.
import duckdb
from fastapi import FastAPI
app = FastAPI()
db = duckdb.connect('dashboard.duckdb', read_only=True)
@app.get("/api/sales-summary")
def sales_summary():
result = db.execute("""
SELECT region, SUM(amount) AS total
FROM sales GROUP BY region
ORDER BY total DESC
""").df()
return result.to_dict(orient='records')
별도 DB 서버 없이 단일 파일로 읽기 전용 API를 만들 수 있습니다. 사용자가 늘어 동시 쓰기 부하가 생기면 그때 PostgreSQL로 마이그레이션해도 늦지 않습니다.
DuckDB vs SQLite vs pandas — 언제 뭘 쓸까

세 도구 모두 훌륭하지만, 각자 빛나는 영역이 다릅니다. 핵심 차이를 정리하면 다음과 같습니다.
DuckDB를 선택해야 할 때:
- 집계·필터·조인 같은 분석 쿼리가 핵심인 경우
- 수백 MB에서 수십 GB 규모의 파일을 빠르게 훑어야 할 때
- CSV·JSON·Parquet 등 다양한 포맷을 SQL로 통합 분석하고 싶을 때
- SQL에 익숙한 개발자나 데이터 분석가
SQLite를 선택해야 할 때:
- 앱의 로컬 저장소가 필요한 경우 (모바일 앱, 설정 저장, 임베디드 시스템)
- 한 행씩 읽고 쓰는 CRUD 작업이 주된 워크로드
- 트랜잭션 안정성(ACID)이 중요한 경우
pandas를 선택해야 할 때:
- 데이터 전처리(결측치 처리, 피벗, 리샘플링)가 핵심인 경우
- matplotlib, seaborn 등 시각화 라이브러리와 직접 연동해야 할 때
- scikit-learn 등 머신러닝 파이프라인에 통합해야 할 때
실무에서는 세 도구가 경쟁이 아니라 보완 관계입니다. DuckDB로 대용량 파일을 필터·집계한 뒤, 축소된 결과를 pandas DataFrame으로 받아 시각화하고, 최종 결과를 SQLite에 캐싱하는 파이프라인이 개인 프로젝트에서 매우 효과적입니다.
한 가지 유용한 팁을 더하면, DuckDB는 SQLite 파일도 직접 읽을 수 있습니다.
INSTALL sqlite;
LOAD sqlite;
SELECT * FROM sqlite_scan('app.db', 'users')
WHERE created_at > '2026-01-01';
기존 SQLite 데이터베이스의 분석 쿼리 속도가 느리다고 느껴진다면, DuckDB를 분석 전용 엔진으로 붙이는 것만으로도 극적인 성능 향상을 경험할 수 있습니다.
알아두면 유용한 DuckDB 고급 기능 활용법
기본기를 넘어 실무에서 자주 쓰게 되는 기능 몇 가지를 추가로 소개합니다.
영구 데이터베이스 파일
지금까지 예시는 모두 인메모리 모드였습니다. 분석 결과를 영구 저장하고 싶다면 파일 경로를 지정합니다.
duckdb my_analysis.duckdb
이 파일 안에 테이블을 만들고, 뷰를 정의하고, 인덱스를 걸 수 있습니다. 다음에 같은 파일을 열면 이전 상태가 그대로 유지됩니다. 파일 하나가 곧 완전한 데이터베이스입니다.
HTTP와 S3에서 직접 읽기
DuckDB는 로컬 파일뿐 아니라 HTTP URL이나 S3 버킷의 파일도 직접 쿼리할 수 있습니다.
INSTALL httpfs;
LOAD httpfs;
-- 공개 HTTP URL의 Parquet 파일 쿼리
SELECT COUNT(*)
FROM 'https://example.com/data/public_dataset.parquet';
-- S3 버킷 (인증 설정 후)
SET s3_region = 'ap-northeast-2';
SET s3_access_key_id = 'your-key';
SET s3_secret_access_key = 'your-secret';
SELECT * FROM 's3://my-bucket/data/*.parquet' LIMIT 100;
데이터 레이크의 파일을 로컬로 내려받지 않고도 SQL로 탐색할 수 있다는 점에서, 간이 데이터 레이크 쿼리 엔진으로도 활용이 가능합니다.
윈도우 함수와 CTE
DuckDB는 PostgreSQL 수준의 고급 SQL 문법을 지원합니다. 윈도우 함수, CTE(Common Table Expression), LATERAL JOIN, PIVOT/UNPIVOT, LIST/STRUCT 같은 복합 타입 등 분석에 필요한 거의 모든 SQL 기능이 구현되어 있습니다.
-- 지역별 월간 매출 순위를 윈도우 함수로 계산
WITH monthly AS (
SELECT region,
DATE_TRUNC('month', date) AS month,
SUM(amount) AS monthly_sales
FROM 'sales.csv'
GROUP BY region, DATE_TRUNC('month', date)
)
SELECT region, month, monthly_sales,
RANK() OVER (
PARTITION BY month
ORDER BY monthly_sales DESC
) AS sales_rank
FROM monthly
ORDER BY month, sales_rank;
확장(Extension) 생태계
DuckDB는 코어를 가볍게 유지하면서 기능을 확장으로 분리합니다. 자주 쓰이는 확장을 정리하면:
- httpfs: HTTP, S3, GCS 원격 파일 읽기
- json: 고급 JSON 파싱 (기본 내장이지만 확장으로 추가 기능 제공)
- spatial: 지리 데이터 처리 (PostGIS와 유사한 기능)
- sqlite: SQLite 파일 직접 읽기와 쓰기
- postgres: PostgreSQL에 직접 연결해 쿼리
- excel: Excel 파일 읽기
- fts: 전문 검색(Full-Text Search)
- iceberg: Apache Iceberg 테이블 포맷 지원
확장 설치는 SQL 두 줄이면 됩니다.
INSTALL httpfs;
LOAD httpfs;
한 번 설치하면 이후에는 LOAD만 하면 됩니다. 영구 데이터베이스 파일을 쓰는 경우에는 자동 로딩 설정도 가능합니다.
DBeaver·DataGrip 등 GUI 도구 연동
CLI가 불편하다면 DBeaver, DataGrip 같은 데이터베이스 GUI 도구에서도 DuckDB를 사용할 수 있습니다. DBeaver는 DuckDB를 공식 지원하므로, 새 연결 만들기에서 DuckDB를 선택하고 데이터베이스 파일 경로만 지정하면 됩니다. 테이블 브라우저, 쿼리 에디터, 결과 내보내기 등 GUI의 편의 기능을 그대로 활용할 수 있습니다.
마무리 — 데이터가 있는 곳에서 바로 분석하는 시대
DuckDB의 핵심 가치를 한 문장으로 줄이면 이렇습니다. 데이터가 있는 곳에서, 있는 그대로, SQL로 바로 분석한다.
CSV 파일 하나를 분석하기 위해 데이터베이스 서버를 설치하던 시대는 지나갔습니다. JSON 로그를 파싱하기 위해 Python 스크립트를 처음부터 짜던 시간도 줄어들었습니다. DuckDB는 데이터 분석의 진입 장벽을 터미널 한 줄로 낮춰줍니다.
물론 DuckDB가 PostgreSQL이나 BigQuery를 완전히 대체하지는 않습니다. 다중 사용자가 동시에 쓰기 작업을 하는 OLTP 워크로드에는 전통적인 데이터베이스가 여전히 필요합니다. 하지만 “이 파일의 데이터를 빠르게 확인하고 싶다”는 일상적인 요구에 대해서는 DuckDB가 현존하는 가장 효율적인 답입니다.
오늘 다룬 핵심을 정리합니다.
- DuckDB는 서버가 필요 없는 인프로세스 분석 엔진입니다.
- CSV, JSON, Parquet 파일을 SQL의
FROM절에 직접 넣어 쿼리합니다. - 글로브 패턴으로 여러 파일을 한 번에 읽고, 서로 다른 포맷끼리 JOIN합니다.
- Python의 pandas와 자연스럽게 통합되어 대용량 분석의 성능 병목을 해결합니다.
- HTTP URL, S3, SQLite, PostgreSQL까지 확장으로 연결해 데이터가 어디에 있든 분석할 수 있습니다.
지금 컴퓨터에 분석하고 싶은 CSV 파일이 하나라도 있다면, pip install duckdb 또는 winget install DuckDB.cli 한 줄로 시작해 보세요. SQL 한 줄이 엑셀 수십 번 클릭을 대체하는 경험이, 데이터를 다루는 방식 자체를 바꿔줄 것입니다.
참고 자료
- DuckDB 공식 문서 — 설치, SQL 문법, 확장 기능 등을 다루는 공식 레퍼런스
- Wikipedia — DuckDB — DuckDB의 개발 배경, 아키텍처, 특징을 정리한 백과사전 문서