DuckDBは、SQLiteのようにインストール不要で使える高速分析向けデータベースです。CSVやParquetファイルを直接SQLで查询でき、100万行の集計クエリも15msで処理します。本記事ではUbuntu 24.04 LTS(Docker公式イメージ)を実際に使ってインストールからクエリ実行、ストレージ比較、ベンチマークまで全工程を驗證しています。
この記事のポイント
- DuckDBは
wget+unzipの2コマンドでインストール完了(apt不要) - Parquet形式なら100万行GROUP BYを14msで処理(SQLiteの約17倍高速)
- ストレージはCSV比で約1/5に圧縮(列指向フォーマットの効果)
- Ubuntu 24.04 / 22.04 両方で動作確認済み

前提環境
本記事の検証は以下の環境で実施しました。
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 24.04 LTS / 22.04 LTS(Docker公式イメージ) |
| DuckDB | v1.5.4(Variegata)※ 2026年6月時点の最新版 |
| 実行方式 | docker run --rm ubuntu:24.04 内で実行 |
| ホストOS | Ubuntu 24.04(Docker 24系) |
| 計測日 | 2026年6月19日 |
DuckDBとは — SQLiteと何が違うのか
DuckDBは「分析に特化した組み込みDB」です。SQLiteと同じくサーバー不要で1ファイルで動作しますが、設計思想が明確に違います。
| 比較項目 | SQLite | DuckDB |
|---|---|---|
| 得意分野 | トランザクション(行単位のINSERT/UPDATE) | 分析クエリ(GROUP BY / JOIN / Window関数) |
| ストレージ形式 | 行指向 | 列指向 |
| CSV直接読み込み | ×(要IMPORT処理) | ○(read_csv_auto()一発) |
| Parquet対応 | ×(別途拡張機能) | ○(標準サポート、圧縮効率◎) |
| 100万行GROUP BY | 約238ms | 約15ms(Parquet読み込み時) |
| インストール | apt install sqlite3 |
wget+unzip(バイナリ単体) |
データを「読む・分析する」用途では、DuckDBが圧倒的に有利です。逆にリアルタイムなトランザクション処理はSQLiteの得意分野なので、使い分けが重要になります。
注意
DuckDBはaptリポジトリには登録されていません。公式バイナリをダウンロードして配置します。本記事の手順は Ubuntu 24.04 LTS で検証していますが、22.04 LTS でも同じ手順で動作します。
① Ubuntuへのインストール方法(2コマンドで完了)
まずは最新版のダウンロードURLを確認しましょう。DuckDBはGitHubでリリース管理されているため、APIから最新バージョンを取得できます。
v1.5.4
# ダウンロード(約5秒・20MB)
$ wget -q https://github.com/duckdb/duckdb/releases/download/v1.5.4/duckdb_cli-linux-amd64.zip
$ unzip duckdb_cli-linux-amd64.zip
Archive: duckdb_cli-linux-amd64.zip
inflating: duckdb
$ chmod +x duckdb && sudo mv duckdb /usr/local/bin/
展開されるのはduckdbという単一バイナリのみ。依存ライブラリのインストールは不要です。正直、これだけで使えるようになるのは気持ちいいです。
unzip が入っていない場合
最小構成のUbuntuでは unzip がないことがあります。その場合は先に sudo apt install unzip を実行してください。
② インストール確認 — バージョン情報の取得
v1.5.4 (Variegata) 08e34c447b
「Variegata」はそのバージョンのコードネーム、08e34c447b がコミットハッシュです。ビルド識別に使えます。

③ 基本的な使い方 — CSVを読み込んでSQLを使う
DuckDBの最大の特徴は、CSVファイルをそのままSQLテーブルとして読める点です。データを事前に変換する必要はありません。
サンプルデータで動作確認
ここでは1000行の売上データ(CSV)を用意して、DuckDBで集計してみます。
$ duckdb -c “
SELECT city,
SUM(amount) AS total_amount,
COUNT(*) AS transactions,
ROUND(AVG(amount),0) AS avg_amount
FROM read_csv_auto(‘/tmp/sales.csv’)
GROUP BY city
ORDER BY total_amount DESC;”
┌─────────┬──────────────┬──────────────┬────────────┐
│ city │ total_amount │ transactions │ avg_amount │
│ varchar │ int128 │ int64 │ double │
├─────────┼──────────────┼──────────────┼────────────┤
│ Sapporo │ 1099864 │ 208 │ 5288.0 │
│ Osaka │ 1055087 │ 207 │ 5097.0 │
│ Nagoya │ 1023447 │ 199 │ 5143.0 │
│ Kyoto │ 934294 │ 198 │ 4719.0 │
│ Tokyo │ 912743 │ 188 │ 4855.0 │
└─────────┴──────────────┴──────────────┴────────────┘
read_csv_auto('/tmp/sales.csv') でCSVのスキーマを自動判定し、そのままSQLの対象にできます。ヘッダー行も型推定も自動处理されます。

CREATE TABLE と JOIN の動作確認
通常のテーブル作成やJOINもSQL標準の構文で動きます。
CREATE TABLE departments (id INT, name VARCHAR);
CREATE TABLE employees (id INT, name VARCHAR, dept_id INT, salary INT);
INSERT INTO departments VALUES (1,’Engineering’),(2,’Marketing’),(3,’Sales’);
INSERT INTO employees VALUES
(1,’Tanaka’,1,800),(2,’Suzuki’,1,750),(3,’Yamamoto’,2,600),
(4,’Sato’,3,700),(5,’Takahashi’,2,650);
SELECT d.name AS dept, e.name AS emp, e.salary
FROM employees e JOIN departments d ON e.dept_id = d.id
ORDER BY e.salary DESC;”
┌─────────────┬─────────────┬────────┐
│ dept │ emp │ salary │
├─────────────┼─────────────┼────────┤
│ Engineering │ Tanaka │ 800 │
│ Engineering │ Suzuki │ 750 │
│ Sales │ Sato │ 700 │
│ Marketing │ Takahashi │ 650 │
│ Marketing │ Yamamoto │ 600 │
└─────────────┴─────────────┴────────┘
④ ストレージ効率の比較 — CSV vs Parquet vs SQLite vs DuckDB
DuckDBは列指向ストレージのため、同じデータでもファイルサイズが大きく異なります。100万行のデータで各フォーマットの容量を比較しました。

ParquetとDuckDBネイティブ形式は、CSVの約1/5〜1/6の容量に収まります。列指向フォーマットは同じカラムの値をまとめて圧縮するため、重複の多いデータほど効果が高くなります。
各フォーマットへの変換コマンド
$ duckdb -c “COPY (SELECT * FROM read_csv_auto(‘/tmp/big_sales.csv’))
TO ‘/tmp/sales.parquet’ (FORMAT PARQUET);”
# CSV → DuckDBネイティブDB 変換
$ duckdb /tmp/mydata.db -c “CREATE TABLE sales AS
SELECT * FROM read_csv_auto(‘/tmp/big_sales.csv’);”
⑤ パフォーマンス検証 — 100万行GROUP BYベンチマーク
ストレージに次いで気になるのがクエリ速度です。100万行のデータで同じGROUP BY集計を実行し、各フォーマットの処理時間を比較しました。

計測結果の詳細
- Parquet → DuckDB: 14ms(最速・列指向ストレージの利が最大)
- DuckDBネイティブ: 15ms
- CSV → DuckDB: 54ms(テキストパースオーバーヘッドあり)
- SQLite: 238ms(行指向のため分析クエリは遅い)
- 計測条件: Ubuntu 24.04 Docker / 3回実行の平均値
DuckDB(Parquet)はSQLiteの約17倍高速です。CSV直接読み込みでも54msと十分実用的で、Parquet形式を使えばさらに1/4に短縮できます。データ分析パイプラインでDuckDBを使うなら、まずはCSVをParquetに変換する一手間が効果的です。
⑥ Ubuntu 22.04 / 24.04 のバージョン横断動作確認
DuckDBは Ubuntu 22.04 LTS でも 24.04 LTS でも同じ手順で動作します。両バージョンでの確認結果を以下にまとめます。
| 項目 | Ubuntu 24.04 | Ubuntu 22.04 |
|---|---|---|
| インストール結果 | ○ 正常(python3.12) | ○ 正常(python3.10) |
| DuckDB バージョン | v1.5.4 (Variegata) | v1.5.4 (Variegata) |
| バイナリサイズ | 60MB | 60MB |
| 基本クエリ実行 | ○ 正常動作 | ○ 正常動作 |
どちらのバージョンでもPythonのバージョンが違っても、DuckDBの動作に差はありません。バイナリ単体で配布されているため、OSのバージョン差異に左右されにくいのが利点です。
⑦ 発展的な使い方 — Window関数とCTE
DuckDBはSQL標準のWindow関数やCTE(Common Table Expression)にもフル対応しています。
Window関数の例
部署ごとの給与ランキングをRANK() OVERで取得します。
SELECT name, dept, salary,
RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS dept_rank,
salary – AVG(salary) OVER () AS diff_from_avg,
ROUND(AVG(salary) OVER (PARTITION BY dept),0) AS dept_avg
FROM emp;”
┌─────────┬───────┬────────┬───────────┬───────────────┬──────────┐
│ name │ dept │ salary │ dept_rank │ diff_from_avg │ dept_avg │
├─────────┼───────┼────────┼───────────┼───────────────┼──────────┤
│ Kimura │ Mkt │ 850 │ 1 │ 100.0 │ 750.0 │
│ Suzuki │ Eng │ 900 │ 1 │ 150.0 │ 850.0 │
│ Tanaka │ Eng │ 800 │ 2 │ 50.0 │ 850.0 │
│ Sato │ Sales │ 700 │ 1 │ -50.0 │ 650.0 │
└─────────┴───────┴────────┴───────────┴───────────────┴──────────┘

CTE(Common Table Expression)の例
WITH句で一時テーブルを定義し、人口密度を計算します。
WITH city_totals AS (
SELECT ‘Tokyo’ AS city, 1200000 AS pop, 500.5 AS area_km2
UNION ALL SELECT ‘Osaka’, 880000, 225.1
UNION ALL SELECT ‘Nagoya’, 740000, 326.5
)
SELECT city, pop, area_km2,
ROUND(pop::FLOAT / area_km2, 0) AS pop_per_km2
FROM city_totals ORDER BY pop_per_km2 DESC;”
┌─────────┬────────┬────────────┬───────────────┐
│ city │ pop │ area_km2 │ pop_per_km2 │
├─────────┼────────┼────────────┼───────────────┤
│ Osaka │ 880000 │ 225.1 │ 3909.0 │
│ Tokyo │1200000 │ 500.5 │ 2398.0 │
│ Nagoya │ 740000 │ 326.5 │ 2266.0 │
└─────────┴────────┴────────────┴───────────────┘
DuckDBの全体像 — パフォーマンス数値まとめ

まとめ
DuckDBはUbuntuに2コマンドで導入でき、分析用途ではSQLiteを大きく上回るパフォーマンスを発揮します。
この記事のポイント おさらい
wget+unzipでインストール完了。aptリポジトリ不要- CSV/ParquetをそのままSQLの対象にできる(
read_csv_auto()) - 100万行GROUP BYを15msで処理(SQLiteの約17倍高速)
- Parquet形式でストレージをCSVの約1/5に圧縮
- Window関数・CTEなどSQL標準機能をフルサポート
- Ubuntu 24.04 / 22.04 両方で動作確認済み
DuckDBはデータ分析の前処理や、ローカルでのSQL学習に非常に有用なツールです。大きなCSVファイルを手動で集計している場合は、DuckDBに切り替えるだけで劇的に速くなります。
本格的なデータ分析環境を整えたい場合は、VPS上にDuckDBとJupyter Notebookを組み合わせて構築するのもおすすめです。以下のVPS記事もあわせて参考にしてください。




コメント