핵심 요약
OLAP은 PostgreSQL·MySQL 같은 OLTP DB로는 한계. column-oriented + 압축으로 100배 빠른 쿼리. 2026년 시점 두 표준 — ClickHouse (서버형 대규모) vs DuckDB (임베디드 단일 노드).
- ClickHouse 25.x: 페타바이트 분산
- DuckDB 1.0+ (2024): 단일 머신, 경량, Postgres 대비 100배
- 둘 다 SQL, columnar storage, 거의 무료 (오픈소스)
1. 핵심 차이
| 항목 | ClickHouse | DuckDB |
|---|
| 아키텍처 | 분산 서버 | 임베디드 (in-process) |
| 설치 | 서버 클러스터 | 라이브러리 import |
| 데이터 규모 | PB 가능 | ~1TB 한계 |
| 동시 사용자 | 수천명 | 1명 (단일 프로세스) |
| 운영 부담 | 중간 (자체 호스팅) | 없음 |
| 학습 곡선 | 가파름 | 매우 단순 |
2. DuckDB — 단일 노드
# Python
pip install duckdb
import duckdb
conn = duckdb.connect('mydb.duckdb')
# CSV 직접 읽기
result = conn.sql("SELECT * FROM 'sales.csv' WHERE amount > 100")
# Parquet
result = conn.sql("SELECT user_id, SUM(amount) FROM 's3://bucket/data/*.parquet' GROUP BY user_id")
# Pandas DataFrame 직접
import pandas as pd
df = pd.read_csv('sales.csv')
result = conn.sql("SELECT * FROM df WHERE amount > 100").df()
3. DuckDB 강점
- 설치·운영 0 — 라이브러리 import만
- Pandas·Arrow·Parquet 네이티브
- S3·HTTP·HDFS 직접 쿼리
- 단일 머신에서 1TB까지 즉시 처리
- Postgres·MySQL extension으로 직접 조회
4. ClickHouse — 분산
# 설치
curl https://clickhouse.com/ | sh
./clickhouse server
# 또는 Docker
docker run -d -p 8123:8123 clickhouse/clickhouse-server
-- 테이블 생성
CREATE TABLE events (
event_time DateTime,
user_id UInt64,
event_type LowCardinality(String),
payload JSON
) ENGINE = MergeTree
PARTITION BY toYYYYMM(event_time)
ORDER BY (event_time, user_id);
-- 1억 행 INSERT (수십 초)
-- 분석 쿼리 — 1억 행 GROUP BY 1초
SELECT event_type, count(*)
FROM events
WHERE event_time >= now() - INTERVAL 7 DAY
GROUP BY event_type;
5. ClickHouse 강점
- PB 규모 분산 처리
- 실시간 INSERT (초당 수백만)
- materialized view·projections으로 자동 사전 계산
- S3·Kafka·Postgres CDC 통합
- SQL 표준 + 풍부한 함수
6. 성능 비교 (1억 행 GROUP BY)
| DB | 시간 |
|---|
| PostgreSQL (인덱스 있음) | 30초 |
| DuckDB (single core) | 1.2초 |
| DuckDB (8 core) | 0.3초 |
| ClickHouse (단일 노드) | 0.4초 |
| ClickHouse (3노드 분산) | 0.15초 |
7. 의사결정 매트릭스
| 워크로드 | 1순위 |
|---|
| 로컬 데이터 분석 (10GB~1TB) | DuckDB |
| Jupyter notebook 분석 | DuckDB |
| 실시간 대시보드 (다중 사용자) | ClickHouse |
| 로그 분석 (TB 이상) | ClickHouse |
| 이벤트 트래킹 (실시간) | ClickHouse |
| 임시 분석·POC | DuckDB |
| 메타프레임워크 (지표 백엔드) | ClickHouse |
8. 통합 패턴 — DuckDB on Iceberg
import duckdb
conn = duckdb.connect()
conn.execute("INSTALL iceberg; LOAD iceberg;")
result = conn.sql("""
SELECT user_id, COUNT(*)
FROM iceberg_scan('s3://lakehouse/events')
WHERE event_time >= '2026-04-01'
GROUP BY user_id
""").df()
S3에 있는 Iceberg 테이블을 DuckDB로 직접 분석. Snowflake·Databricks 대안.
9. ClickHouse + Kafka 실시간
CREATE TABLE events_kafka (
user_id UInt64,
event_type String,
payload String
) ENGINE = Kafka
SETTINGS kafka_broker_list = 'kafka:9092',
kafka_topic_list = 'events',
kafka_group_name = 'clickhouse',
kafka_format = 'JSONEachRow';
CREATE MATERIALIZED VIEW events_mv
TO events AS
SELECT user_id, event_type, payload, now() AS event_time
FROM events_kafka;
-- Kafka 메시지가 자동으로 ClickHouse로 적재
10. DuckDB UDF·Extension
# Python UDF
def classify(x):
return "A" if x > 100 else "B"
conn.create_function("classify", classify)
result = conn.sql("SELECT classify(amount) FROM sales")
11. 운영 — ClickHouse
- ZooKeeper 또는 ClickHouse Keeper로 클러스터 조정
- S3 backed storage로 무한 확장
- materialized views 신중히 (write 비용 증가)
- 스키마 변경은 ALTER TABLE — 빠르지만 metadata 격리 필요
- backup — clickhouse-backup tool
12. 운영 — DuckDB
- 단일 파일 (.duckdb) — 백업 = 파일 복사
- concurrent write 안 됨 (read 동시 OK)
- 큰 데이터는 partitioned Parquet으로 권장
- 대시보드 임베드 (motherduck SaaS)
13. SQL 호환
-- ClickHouse: 표준 SQL + 자체 함수
SELECT toStartOfMinute(event_time), count() FROM events GROUP BY 1
-- DuckDB: PostgreSQL 호환 (대부분)
SELECT date_trunc('minute', event_time), count(*) FROM events GROUP BY 1
DuckDB가 PG 호환성 강함. ClickHouse는 자체 함수 풍부.
14. 비용 비교 (1TB 데이터, 10K 쿼리/일)
| 옵션 | 월 비용 |
|---|
| Snowflake | ~$2,500 |
| BigQuery on-demand | ~$1,200 |
| ClickHouse Cloud | ~$600 |
| self-hosted ClickHouse | ~$200 (EC2) |
| DuckDB on EC2 | ~$50 |
15. 함께 쓰는 패턴
- ClickHouse: production 대시보드·로그·이벤트
- DuckDB: ad-hoc 분석·Jupyter·CI에서 ETL 검증
- Iceberg: 데이터 single source, 둘 다 직접 쿼리
자주 묻는 질문
1TB 미만은 DuckDB 충분?대부분 그렇다. 단 다중 사용자 동시 쓰기는 ClickHouse 필요.
실시간 INSERT 성능?ClickHouse가 압도. 초당 100만+ 행. DuckDB는 단일 사용자라 한계.
운영 부담 비교?DuckDB ~ 0. ClickHouse ~ Postgres 운영 + 추가 (replica·backup·shard).
댓글 0