DuckDB とは、サーバーを立てずにアプリの中で動く分析用(OLAP)のSQLデータベースです。pip install duckdb の一行で入り、ParquetやCSVのファイルを取り込み作業なしでそのままSQLで問い合わせられます。「SQLiteの分析版」と説明されることが多く、実際に設計思想も近い位置にあります。

DuckDBとSQLite・PostgreSQLの役割の違いを示す比較図
DuckDBは「サーバーを立てない」ことはSQLiteと同じで、「分析に強い」ことがSQLiteと違う

DevOps・自動化の道具立て全体は AI自動化ツール|ノーコードからコードまで2026年版の比較と選び方 にまとめています。

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;

なぜ「サーバーが要らない」ことがそこまで効くのか

分析用のデータベースというと、これまでは「専用のサーバーを立て、データを流し込み、権限を設計し、運用を続ける」ものでした。この初期コストがあるために、「ちょっと集計したいだけ」の用途では最初からデータベースが選択肢に入らず、pandasやスプレッドシートで済ませるという判断になりがちでした。

DuckDBはこの前提を崩します。プロセスもポートも設定ファイルも要らず、ライブラリとしてアプリの中で動きます。結果として、次のような場面で「データベースを使う」判断ができるようになります。

一度きりの調査:手元に届いた数GBのCSVを、SQLで切り口を変えながら確認する。終わったら消す
CI・バッチの中の集計:ジョブの一工程としてSQLを実行する。外部DBへの接続情報を持たせずに済む
ノートブックでの分析:pandasのDataFrameに対して、読みづらくなりがちな多段のgroupby・mergeをSQLで書く
アプリへの組み込み:デスクトップアプリやCLIの内部で、ユーザーのローカルデータを集計する

flowchart LR A["手元のファイル
Parquet / CSV / JSON"] --> B["DuckDB
(アプリ内で動く)"] C["pandas DataFrame"] --> B D["既存DB
PostgreSQL 等"] -.拡張機能.-> B B --> E["SQLで集計・結合"] E --> F["DataFrame で受け取る"] E --> G["Parquet / CSV へ書き出す"] style B fill:#0f766e,color:#fff style E fill:#0ea5e9,color:#fff

図のとおり、DuckDBは入力も出力も「今使っている形式」のまま扱えるのが特徴です。データを別の場所へ移してから分析する、という段取りが不要になります。

SQLite・PostgreSQLとの違い――どれを選ぶかの判断表

「DuckDB とは」を調べたとき、いちばん知りたいのは既に知っているDBとの違いのはずです。3つの軸で並べます。

  DuckDB SQLite PostgreSQL
動き方 アプリ内(インプロセス) アプリ内(インプロセス) サーバープロセス
得意な処理 分析(OLAP):大量行の集計・結合 トランザクション(OLTP):1行の読み書き 両方(汎用)
データの持ち方 列指向 行指向 行指向
ファイルを直接読む Parquet/CSV/JSONを取り込みなしで読める 基本は取り込みが必要 拡張機能や外部テーブルが必要
同時書き込み 想定していない 限定的 得意
導入コスト pip install のみ ほぼゼロ サーバー構築・運用が必要
ひとことで言うと
SQLiteの置き換えではない:1件を読み書きするアプリのDBならSQLiteのままでよい
PostgreSQLの置き換えでもない:複数プロセスから同時に書き込むならサーバー型が必要
DuckDBが刺さるのは「手元にある大きなファイルを、SQLで何度も切り口を変えて集計したい」とき。pandasで書くと読みづらい集計を、SQLで書けるようにするのが実態に近い使い方です

DuckDBの使い方――ファイルを直接SQLで読む

DuckDBの最大の特徴は、テーブルを作ってINSERTする工程が要らないことです。ファイルパスをそのままFROM句に書けます。

-- CSVをそのまま集計する(インポート不要)
SELECT category, count(*) AS n, avg(price) AS avg_price
FROM 'data/sales.csv'
GROUP BY category
ORDER BY n DESC;

-- Parquetも同じ。ワイルドカードで複数ファイルをまとめて読む
SELECT date_trunc('month', ordered_at) AS m, sum(amount)
FROM 'data/orders/*.parquet'
GROUP BY 1 ORDER BY 1;

-- 別形式どうしを結合することもできる
SELECT o.id, u.name
FROM 'data/orders/*.parquet' o
JOIN 'data/users.csv' u ON o.user_id = u.id;

-- 結果をParquetで書き出す
COPY (SELECT * FROM 'data/sales.csv' WHERE price > 1000)
TO 'out/expensive.parquet' (FORMAT PARQUET);

Pythonからも同じSQLをそのまま使えます。

import duckdb

# ファイルを直接クエリして DataFrame で受け取る
df = duckdb.sql("SELECT * FROM 'data/orders/*.parquet' LIMIT 100").df()

# 逆に、手元の DataFrame を SQL の対象にできる(変数名をそのまま書く)
import pandas as pd
orders = pd.read_csv("data/sales.csv")
duckdb.sql("SELECT category, sum(price) FROM orders GROUP BY category").show()

# 永続化したいときだけファイルDBを開く(省略時はインメモリ)
con = duckdb.connect("analytics.duckdb")
con.sql("CREATE TABLE sales AS SELECT * FROM 'data/sales.csv'")
詰まりやすい3点
メモリより大きいデータ:DuckDBはディスクへ退避しながら処理できますが、無制限ではありません。極端に大きい入力では列を絞る(SELECT * を避ける)だけで大きく変わります
CSVの型推定:自動推定が効きますが、桁の大きいIDが数値と判定されて先頭のゼロが落ちる等は起こります。read_csv で型を明示するのが安全です
同時書き込み:1つのDBファイルに複数プロセスから書き込む用途は想定外です。書き込みは1プロセスに集約してください

pandasと比べてどちらを使うか

Pythonでデータを扱っているなら、pandasとの使い分けが実務的な論点になります。どちらが優れているという話ではなく、書きやすさと規模で切り替えるのが現実的です。

場面 向いている方 理由
数万行の整形・可視化前処理 pandas メソッドチェーンで完結する。SQLに直す手間のほうが大きい
多段のgroupby・merge・window DuckDB SQLのほうが意図が読みやすく、あとから読み返せる
メモリに載らない規模 DuckDB ディスクへ退避しながら処理する。pandasは基本的に全量をメモリに載せる
複数ファイルの横断集計 DuckDB ワイルドカードでまとめて読める。ファイルごとの読み込みループが不要
行ごとの複雑なPython処理 pandas 任意のPython関数を適用できる

実際には両方を行き来するのが普通です。DuckDBはDataFrameを直接SQLの対象にでき、結果もDataFrameで返せるため、「重い集計だけSQLに投げ、細かい整形はpandasで」という分担がそのまま書けます。移行のためにコードを全面的に書き換える必要はありません。

拡張機能で何が増えるか

DuckDBは本体を小さく保ち、機能を拡張としてロードする設計です。よく使われるものを挙げます。

httpfs:S3やHTTP上のParquet/CSVを、ローカルファイルと同じ書き方でクエリできるようにする
json:JSON/JSONL を構造のまま読み、ネストしたフィールドを展開する
parquet:Parquetの読み書き(多くのビルドで最初から使える)
postgres / sqlite:既存のPostgreSQLやSQLiteのテーブルを、DuckDB側からそのまま参照する

とくに httpfs と postgres 拡張の組み合わせは実務で効きます。「本番のPostgreSQLからマスタを引き、S3のログParquetと結合して集計する」という処理を、データを一箇所に集めることなく1本のSQLで書けるためです。拡張は INSTALLLOAD の2行で有効になります。

INSTALL httpfs; LOAD httpfs;
SELECT count(*) FROM 's3://my-bucket/logs/2026-07/*.parquet';

2026年7月31日時点のバージョンと状態

項目 実測値
Stars 39,853
ライセンス MIT
最新リリース v1.5.5(2026-07-22・Bugfix Release)
最終push 2026-07-30

v1.0以降は安定版として番号が進んでおり、1.5系のパッチが継続的に出ている状態です。組み込んで使う性質上、クライアントライブラリ(Python/Node/Java等)とDBファイルのバージョン整合は意識しておくと事故が減ります。古いバージョンで作ったファイルを新しいクライアントで開くときは、リリースノートで互換性の記載を確認してください。

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

ツール タイプ 得意領域 スケール セットアップ
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が優位。

実務での使いどころ3パターン

1. 「届いたファイルを調べる」を毎回同じ手順にする

業務では、取引先やシステムからCSVやParquetがそのまま渡ってくる場面が多くあります。従来はExcelで開いて固まる、pandasで読み込んでメモリを使い切る、といった消耗が起きがちでした。DuckDBを間に挟むと、ファイルの形式が何であれ「まず件数と分布を見る」という手順を固定できます。列数が多くても必要な列だけを指定すれば読み込みは軽く済み、SUMMARIZE のような要約からデータの素性を掴めます。調査のたびに書き捨てるスクリプトが減り、SQLとして残せるのが実利です。

2. パイプラインの中間層として使う

ETL/ELTの文脈では、抽出したデータを一度どこかに置いてから変換します。この「置き場所」を専用のデータウェアハウスにすると、小規模なうちは費用と運用が重すぎます。DuckDBはファイル1つで完結するため、バッチジョブの中で一時的なウェアハウスとして立て、処理が終わったら結果だけをParquetで書き出して捨てるという使い方ができます。ジョブが失敗しても状態はファイルに閉じているので、再実行の副作用も読みやすくなります。

規模が大きくなり、複数チームが同時に参照する段階になったら、ClickHouse(クリックハウス)とは?仕組み・PostgreSQL比較・使いどころを2026年最新で解説 のようなサーバー型のOLAPへ移す判断になります。両者は競合というより規模と共有範囲による住み分けです。

3. アプリケーションに組み込んでローカル分析させる

デスクトップアプリやCLIツールの中で、ユーザーの手元にあるデータを集計したい場合、外部サーバーへ送るのは同意取得・通信・プライバシーの観点でハードルが高くなります。DuckDBはライブラリとして同梱できるため、データを外に出さずに集計処理だけを提供できます。手元のDBファイルを触るGUIが欲しい場合は dbx完全解説:20MBで70+DB対応のRust製DBクライアント|MCP・CLI・Docker対応 のような軽量クライアントが使えます。

導入の判断は「共有するか」で決まる

自分(または1プロセス)だけが読み書きする → DuckDBで十分。むしろサーバーを立てないほうが速い
チームで同じデータを同時に更新する → サーバー型(PostgreSQL / ClickHouse 等)が必要
まず価値があるか確かめたい → DuckDBで作ってみて、共有が必要になった時点で移す。SQLで書いてあれば移行時の書き換えは小さい</div>

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

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

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

よくある質問

DuckDBはSQLiteの代わりになりますか? 用途が違うため、置き換えにはなりません。SQLiteは1件単位の読み書き(OLTP)に最適化されており、アプリの永続ストアとしては引き続きSQLiteが適しています。DuckDBは大量行の集計(OLAP)側の担当です。両方をプロジェクト内に置くのは矛盾ではありません。

データはどこに保存されますか? 接続先を指定しなければインメモリで動き、プロセス終了とともに消えます。duckdb.connect("analytics.duckdb") のようにファイルを指定すると、そのファイル1つにテーブルが保存されます。ファイルを配れば、そのまま相手の環境で開けます。

大きなデータでもメモリに載りますか? DuckDBはメモリを超える処理でディスクへ退避しながら実行できますが、無制限ではありません。実務では SELECT * を避けて必要な列だけ読むファイル側をParquetにしておく(列単位で読み飛ばせる)の2点で、扱える規模が大きく変わります。

複数人・複数プロセスで同時に使えますか? 書き込みを複数プロセスから行う用途は想定されていません。読み取り中心なら問題になりにくいですが、共有の書き込み先が必要ならサーバー型のデータベースを使ってください。

商用利用できますか? ライセンスは MIT です(2026年7月31日 GitHub API 実測)。組み込み配布を含めて利用できますが、実際の配布形態に合わせてライセンス表記の要否は各自で確認してください。

参照ソース

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

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