DuckDB (OLAP / 分析DB)(ダックディービー)
CWI Amsterdam 2019年公開のIn-process OLAP データベース。「SQLite for Analytics」を標榜、Columnar Storage・Vectorized Execution・Parquet 直接読込で分析処理に特化。
概要
DuckDB は2019年6月Mark Raasveldt / Hannes Mühleisen (CWI Amsterdam・オランダ国立数学コンピュータ研究所) が立ち上げた DuckDB Foundation により MIT ライセンスで公開された In-process OLAP データベース。「SQLite for Analytics」を標榜、SQLite と同様にアプリプロセス内で動く軽量設計ながら、Columnar Storage・Vectorized Execution・Apache Parquet 直接読込・ASOF JOIN 等の現代分析機能をすべて統合、Python / R / Node.js から直接呼出可能。
DuckDB 主要特徴
| 特徴 | 説明 |
|---|---|
| 形態 | In-process (アプリ内動作) |
| 用途 | OLAP (分析) 特化 |
| ストレージ | Columnar (列指向) |
| 実行エンジン | Vectorized (バッチ処理) |
| 標準SQL | PostgreSQL風完全準拠 |
| Parquet | 直接読込・書込 |
| CSV | 高速読込 |
| JSON | ネスト対応 |
| Apache Arrow | ゼロコピー連携 |
| Iceberg | 対応 |
| Delta Lake | 対応 |
| ACID | 完全準拠 |
| ライセンス | MIT |
DuckDB vs SQLite
| 項目 | SQLite | DuckDB |
|---|---|---|
| 設計 | OLTP (取引) | OLAP (分析) |
| ストレージ | Row-oriented | Columnar |
| 実行 | Tuple-at-time | Vectorized |
| データ規模 | KB-GB | GB-TB |
| 並列処理 | 限定的 | 全コア活用 |
| Parquet | 拡張 | ネイティブ |
| Python統合 | sqlite3 | duckdb (Pandas風) |
Python 統合例
import duckdb
import pandas as pd
# Pandas DataFrame から直接クエリ
df = pd.read_csv("sales.csv")
result = duckdb.query("SELECT region, SUM(amount) FROM df GROUP BY region").df()
# Parquet 直接読込
duckdb.query("""
SELECT * FROM 'data/*.parquet'
WHERE date >= '2024-01-01'
""").df()
# CSV / JSON / Iceberg / Delta Lake 全対応
duckdb.query("SELECT COUNT(*) FROM 's3://bucket/*.parquet'")
ベンチマーク (TPC-H scale 100)
| DB | クエリ平均時間 | メモリ |
|---|---|---|
| PostgreSQL | 200秒 | 64GB |
| MySQL | 180秒 | 64GB |
| Snowflake (Cloud) | 30秒 | - |
| BigQuery (Cloud) | 25秒 | - |
| DuckDB (ローカル) | 15秒 | 16GB |
| ClickHouse | 8秒 | 32GB |
ローカルマシンでクラウドDWH に匹敵する分析性能・初期コスト$0。
主要機能
Vectorized Execution
伝統的Tuple-at-time (1行ずつ処理) ではなく、1,000-1,024 値の Vector を CPU SIMD 命令で並列処理。CPU キャッシュ最適化・PostgreSQL 比10-100倍高速。
Apache Parquet 直接読込
-- 別途インポート不要
SELECT * FROM 's3://bucket/yellow_tripdata_*.parquet'
WHERE pickup_datetime >= '2024-01-01'
LIMIT 100;
S3 / Cloud Storage / ローカルファイル全対応・遅延読込で必要列のみメモリロード。
ASOF JOIN
時系列データの近似JOIN (DuckDB 0.8+):
SELECT * FROM trades
ASOF JOIN quotes
ON trades.symbol = quotes.symbol
AND trades.time >= quotes.time
金融時系列・センサーデータの「最も近い前の値と結合」を高速処理。
MotherDuck (2023-)
DuckDB Foundation 関連の Serverless DuckDB クラウドサービス:
- ブラウザでDuckDB 利用
- ローカル + クラウド ハイブリッド実行
- 共有 / コラボレーション
- $25/月 - 法人プラン
duckdb-wasm (ブラウザ DuckDB)
DuckDB を WebAssembly でブラウザ直接動作:
- 完全ブラウザ内処理 (サーバ不要)
- Observable / Jupyter Notebook 統合
- データプライバシ完璧 (データがサーバ送信されない)
- 数百MB Parquet をブラウザで分析可能
関連用語との違い
- vs SQLite: 取引 / 分析
- vs ClickHouse: 単独 / クラスタ
- vs Snowflake / BigQuery: ローカル無料 / クラウド有料
FAQ
Q1: いつ使うべき? A: 数GB-数TB の分析・Pandas / Polars との連携・Parquet 大量データ・ローカル分析・データサイエンスノートブック。
Q2: PostgreSQL でなくDuckDB? A: 単純集計 / Window Function / GROUP BY 等の分析クエリで10-100倍高速。OLTP は PG 推奨・OLAP はDuckDB 推奨。
Q3: Pandas との関係? A: 補完。Pandas 単独でメモリ不足の大データに DuckDB。DuckDB → Pandas DataFrame 双方向変換可能、Polars と並ぶ「Pandas Killer」。