DuckDBとはどんなデータベースか

DuckDBは、アプリケーション内で動作するインプロセス型の分析用(OLAP)SQLデータベースだ。SQLiteがトランザクション処理(OLTP)に特化しているのに対し、DuckDBは分析クエリに最適化されている。列指向のベクトル化実行エンジンにより、大量データの集計や結合を高速に処理する。

サーバープロセスが不要で、pip install duckdb だけで使い始められる。

主な機能とデータ分析での強み

  • サーバーレス・組み込み型:外部プロセス不要。Python、Node.js、Java、Rustなどから直接利用可能
  • ファイル直接クエリ:Parquet、CSV、JSON、ExcelファイルをインポートせずにそのままSQL分析
  • 列指向ベクトル化実行:OLAP特化の実行エンジンで、集計・結合クエリが高速
  • フルSQL対応:Window関数、CTE、サブクエリ、PIVOT、LATERALなど標準SQL機能を網羅
  • pandas連携:DataFrameをゼロコピーでSQLクエリ対象にでき、結果もDataFrameで受け取れる
  • 拡張機能:空間データ(spatial)、HTTP経由のリモートファイル読み込み、PostgreSQLスキャナーなど

インストールとデータ分析の始め方

# Python
pip install duckdb

# CLI(macOS)
brew install duckdb

# Node.js
npm install duckdb

Pythonでの基本的な使い方:

import duckdb

# CSVファイルを直接クエリ
result = duckdb.sql("SELECT * FROM 'sales_data.csv' WHERE amount > 1000")
print(result)

# Parquetファイルの集計
duckdb.sql("""
    SELECT category, SUM(amount) as total
    FROM 'transactions.parquet'
    GROUP BY category
    ORDER BY total DESC
""")

pandasとの連携:

import pandas as pd
import duckdb

df = pd.read_csv("users.csv")

# DataFrameに直接SQLを実行
result = duckdb.sql("SELECT age, COUNT(*) FROM df GROUP BY age ORDER BY age")
result.df()  # 結果をDataFrameに変換

CLIでの対話的クエリ:

duckdb

# S3上のParquetファイルを直接クエリ
SELECT * FROM read_parquet('s3://my-bucket/data/*.parquet') LIMIT 10;

競合データベースとの比較

ツール タイプ 得意領域 スケール セットアップ
DuckDB 組み込みOLAP ローカル分析 シングルノード pip installのみ
SQLite 組み込みOLTP トランザクション シングルノード 標準装備
ClickHouse サーバーOLAP 大規模分析 分散対応 サーバー構築
Polars DataFrameライブラリ メモリ内処理 シングルノード pip installのみ
Apache Spark SQL 分散SQL 大規模ETL 分散クラスタ クラスタ構築

差別化ポイント:DuckDBは「SQLiteの分析版」というポジションで、セットアップの手軽さと分析性能を両立している。ClickHouseは大規模分散処理に強いが、サーバー構築が必要。PolarsはDataFrame APIが中心で、SQLインターフェースではDuckDBが優位。

AI/MLワークフローでのDuckDB活用

LLMアプリケーションのログ分析やRAGのデータ前処理にDuckDBは有効だ。S3上のParquetファイルを直接クエリできるため、Apache AirflowのDAGからDuckDBを呼び出して軽量なETL処理を実行する構成が増えている。

dbtのアダプターとしてもDuckDBが利用でき、ローカルでのデータ変換テストに最適だ。

まとめ:DuckDBが向いているケース

DuckDBは「サーバーを立てずにローカルのファイルをSQLで分析したい」場面で最も力を発揮する。GB単位のCSVやParquetファイルの探索的分析、pandas DataFrameへのSQL実行、CI/CDでのデータ品質チェックなど、手軽さと速度が求められるシーンに最適だ。