DuckDB는 경량화된 컬럼지향 SQL OLAP 데이터베이스로, Pandas처럼 메모리에서 빠르게 분석 쿼리를 처리할 수 있도록 설계된 DB입니다.
간단 요약:
- **OLAP(분석용)**에 최적화
- SQLite처럼 내장형 → 별도 서버 없이 실행 가능
- 컬럼 기반 저장 → 대용량 데이터 집계에 빠름
- Python, R, C++, JavaScript 등에서 직접 사용 가능
- Pandas, Arrow, Parquet, CSV 등과 연동 쉬움
주요 특징:
형태 | 파일 기반 / 임베디드 (서버리스) |
쿼리 언어 | 표준 SQL |
성능 | 대규모 데이터 분석(OLAP)에 특화 |
저장 | 컬럼 저장 방식 (Columnar Format) |
통합성 | Pandas, NumPy, Parquet, Arrow와 즉시 연동 가능 |
유즈케이스 | 대용량 CSV 분석, Pandas 병목 해결, Notebook 분석 |
예시:
import duckdb
import pandas as pd
df = pd.read_csv("big_data.csv")
# Pandas와 DuckDB 연동
result = duckdb.query("SELECT column1, COUNT(*) FROM df GROUP BY column1").to_df()
print(result)
장점:
- 설치 간편 (pip install duckdb)
- 데이터 과학자/분석가에게 적합
- Pandas보다 큰 데이터 처리 가능
- 빠른 집계/조인 처리
SQLite 와의 차이점 및 비교
DuckDB와 SQLite는 둘 다 가볍고 서버 없이 작동하는 내장형 데이터베이스이지만, 목적과 구조가 다릅니다.
🆚 DuckDB vs SQLite 핵심 차이
항목DuckDBSQLite
목적 | OLAP (분석) | OLTP (트랜잭션) |
저장 방식 | 컬럼 기반 (Columnar) | 로우 기반 (Row-based) |
성능 | 대량 데이터 집계/쿼리에 빠름 | 단건 트랜잭션에 유리 |
인덱스 | 자동 최적화, 인덱스 없음 | B-Tree 인덱스 있음 |
사용 대상 | 데이터 과학자, 분석가 | 모바일 앱, 임베디드 시스템 |
멀티 스레딩 | 지원 (병렬 쿼리 처리) | 단일 쓰레드 |
지원 포맷 | Parquet, Arrow, Pandas 직접 연동 | CSV, JSON (간접 연동) |
SQL 호환성 | 고급 SQL 지원 (윈도우 함수 등) | 표준 SQL 일부만 지원 |
요약:
- SQLite = 빠른 읽기/쓰기, 모바일/IoT에 적합 (작고 안정적)
- DuckDB = 대규모 분석 쿼리, Pandas보다 빠른 데이터 처리 가능
용도 추천:
상황추천 DB
안드로이드 앱의 설정 저장 | ✅ SQLite |
Kivy 앱에서 소규모 로컬 DB | ✅ SQLite |
수백 MB 이상 CSV 분석 | ✅ DuckDB |
Pandas 대체 SQL 분석 | ✅ DuckDB |
다음은 SQLite vs DuckDB 성능 비교 예제입니다.
CSV 파일(예: 100만 건 이상)에서 집계 쿼리 처리 속도를 비교합니다.
📁 데이터 준비 (sample.csv 예시)
csv
복사편집
id,category,amount 1,A,100 2,B,150 3,A,200 ... 1000000,C,300
✅ SQLite 예제
import sqlite3
import pandas as pd
import time
df = pd.read_csv("sample.csv")
# SQLite DB 생성 및 데이터 삽입
conn = sqlite3.connect(":memory:")
df.to_sql("data", conn, index=False, if_exists="replace")
start = time.time()
res = conn.execute("SELECT category, SUM(amount) FROM data GROUP BY category").fetchall()
print("SQLite 결과:", res)
print("SQLite 시간:", time.time() - start)
import pandas as pd
import time
df = pd.read_csv("sample.csv")
# SQLite DB 생성 및 데이터 삽입
conn = sqlite3.connect(":memory:")
df.to_sql("data", conn, index=False, if_exists="replace")
start = time.time()
res = conn.execute("SELECT category, SUM(amount) FROM data GROUP BY category").fetchall()
print("SQLite 결과:", res)
print("SQLite 시간:", time.time() - start)
✅ DuckDB 예제
import duckdb
import pandas as pd
import time
df = pd.read_csv("sample.csv")
start = time.time()
res = duckdb.query("SELECT category, SUM(amount) FROM df GROUP BY category").fetchall()
print("DuckDB 결과:", res)
print("DuckDB 시간:", time.time() - start)
📊 비교 결과 (100만 행 기준, PC 환경)
항목SQLiteDuckDB
실행시간 | 약 1.5~2초 | 약 0.2~0.5초 |
병렬처리 | ❌ | ✅ |
컬럼 접근 | 느림 | 빠름 |
Pandas 연동 | 별도 변환 필요 | 바로 가능 |
728x90
반응형
'IT > DB' 카테고리의 다른 글
DB2를 SQL-SERVER로 (1) | 2024.10.18 |
---|---|
ORACLE SEQUENCE (0) | 2024.10.18 |
ORACLE에서 SELECT 시 LOCK 처리 (0) | 2024.10.18 |
DATETIME 필드에 값 넣기 (0) | 2024.10.18 |
SQL-SERVER 간단 TIP (0) | 2024.10.18 |