
2026/08/17 22:46
DuckDB v2.0 のプレビュー
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
DuckDB v2.0、コードネーム「Cyanoptera」は、単独の分析ツールから、複雑なトランザクションワークロードを処理できる堅牢なマルチテナントサーバープラットフォームへの中道的変化を象徴しています。この大規模なアップグレードでは、
quack エクステンションによるネイティブクライアント/サーバーアーキテクチャ、同時操作時のデータ完全性を確保するためのフル MVCC サポート、および従来のエンジンに代わるモダンな PEG ベースのパーサーを中心とした破壊的変更が導入されました。優れたパフォーマンスを実現するために、このリリースは遠隔接続を高速化するための非同期 I/O および、ファイル全体をスキャンせずともデータインデックスへの即座アクセスを可能にするストレージ v2.0 のような最適化されたストレージフォーマットを採用しています。技術的には、タイムゾーン論理をコアシステムに埋め込み、ICU などの外部ライブラリへの依存を排除し、宣言的な YAML 仕様から生成される安定した C API を導入しました。ユーザーはバッファー管理を必要とする新しいデフォルトストレージ方式への適応が求められますが、その対価は大きいです:組織は、PostgreSQL などの多様なデータベースに対してプッシュダウン最適化を適用した統合リモートクエリを実行でき、信頼できるローカルエクステンションリポジトリによる強化されたセキュリティを楽しむことができ、SQL レベルのトリガーや VARIANT タイプ、ベクトル検索機能など高度な機能を活用できるようになりました。本文
DuckDB バージョン 2.0:「シナモンテール」の名で登場!サーバー化や非同期 I/O など、革命的な新機能が多数搭載
DuckDB バージョン 2.0 は、「シナモンテール(Anas cyanoptera)」 という名前が付けられています。西アメリカに生息し、鮮やかな赤褐色の羽を持つ水鳥です。
単なる形式的な手続きではなく、昨年のバージョン 1.5 以降の 1 万回超のコミットを踏まえた「機能強化版」です。「データレイクハウス(Lakehouse)」の年に焦点を当てた前作に対し、今回は**「DuckDB をサーバーとして利用する年」**の幕開けとなる大規模リリースです。
以下の項目にて、バージョン 2.0 の主な新機能を整理します。
1. DuckDB as a Server: Quack and CONNECT
DuckDB はプロセス内データベースとしての設計でしたが、クライアント/サーバーモードへの要望に応えるため遂に実装されました。
-
拡張機能:quack- DuckDB 固有のプロトコルを実装し、他の DuckDB インスタンスと通信可能にします。
- 直前のプレビュー版を踏まえ、バージョン 2.0 で安定版として一般公開されます。
- マルチテナントかつ長期稼動の展開に対応したクライアント/サーバーアーキテクチャを実現します。
-
ステートメント:CONNECT- 新しいリモートデータベースへの接続機能を標準化します。
- 従来のワークアラウンド
に代わり、SQL を直接 PostgreSQL や MySQL などへ送信する新しいリモート・プッシュダウン最適化機能を備えています(#22914)。remote.query($...$)
-- サーバーへの接続とクエリ実行 CALL quack_serve(token = 'my_token'); ATTACH 'quack:server.example.com' AS qk (TOKEN 'my_token'); CONNECT qk; SELECT count(*) FROM events; -- サーバー上で実行され、結果がストリームで戻ってくる DISCONNECT;
-
トランザクション対応の強化:
- 単一ユーザー用途では不要だったため未実装でしたが、**完全な MVCC(多値同時制御)**とトランザクション隔離機能を備えています。
- トランザクション処理において PostgreSQL などと競合する十分な速度を持ち、長期運用に適しています。
-
観測可能性(Observability)の向上:
- より優れたメトリクス、ログ、監視機能を実装(#22799)。
- 一部のユーザーが独自にクライアントを実装したほど需要が高いプロトコルです。
2. VARIANT が第一級市民として確立
バージョン 1.5 で導入された
VARIANT 型が、「ステロイド入りの JSON」(高速化された JSON)として定着しました。
-
主要特徴:
- テキスト形式の JSON と異なり、DuckDB が自動的に共通構造を検出し**「シャレッド(shred)」**することで、ストレージ効率とクエリ速度が向上します。
- スキーマ宣言不要で、リアルタイムログのストリーム進化にも対応します。
-
バージョン 2.0 の新機能:
- ストレージからのシャレッド実行(#20912)
- スキャンへの抽出プッシュダウン(#22478)
- Parquet 向けの VARIANT リード/ライト
関数の追加variant_*
CREATE TABLE events (payload VARIANT); INSERT INTO events VALUES ('{"user": {"id": 42, "tags": ["a", "b"]}}'::JSON::VARIANT); -- 構造の確認とフィルタリング SELECT variant_type(payload), variant_keys(payload) FROM events; SELECT * FROM events WHERE variant_contains(payload, {'user': {'id': 42}}::VARIANT);
- 将来の展望:
- 通常
型にも VARIANT の利点を提供予定であり、既存の JSON ワークロードが恩恵を受けます。JSON
- 通常
3. トリガー機能の実装
長年要望され、バージョン 2.0 で完全に実装されました。
-
対応するタイプ:
およびBEFORE
トリガーAFTER
およびFOR EACH ROWFOR EACH STATEMENT
を通じたトランジションテーブルREFERENCING OLD/NEW TABLE- 複数トリガー、
サポート、RETURNINGDROP TRIGGER
-
古典的なユースケース(監査):
- データ変更を自動記録する仕組みです。
CREATE TABLE target (id INTEGER, val INTEGER); CREATE TABLE audit (id INTEGER, old_val INTEGER, new_val INTEGER); -- トリガー定義 CREATE TRIGGER trg_audit AFTER UPDATE ON target REFERENCING OLD TABLE AS o NEW TABLE AS n FOR EACH STATEMENT INSERT INTO audit SELECT n.id, o.val, n.val FROM o JOIN n ON o.id = n.id; INSERT INTO target VALUES (1, 10), (2, 20); UPDATE target SET val = val * 10 WHERE id <= 2; SELECT * FROM audit; -- 結果 -- | id | old_val | new_val | -- |----|---------|---------| -- | 1 | 10 | 100 | -- | 2 | 20 | 200 |
4. SQL ダイアレクトの追加機能
DuckDB の SQL ダイアレクトは継続的に進化し、以下の主要機能が追加されました。
- NEAREST ジョイン(#24137):
- トップ-k 類似度検索をジョイン節として実装。
- ベクターや埋め込みデータへのワークロードに対応します。
SELECT q.user_id, t.product_id FROM users q INNER JOIN products t APPROX NEAREST 2 BY SIMILARITY array_cosine_similarity(q.embedding, t.embedding);
- CTE 内の DML(#21634, #21997, #24217):
ステートメント内でWITH
,INSERT
,UPDATE
,DELETE
を利用可能。COPY
WITH moved AS MATERIALIZED ( DELETE FROM staging RETURNING * ) INSERT INTO archive SELECT * FROM moved;
- ネストされたスキーマ(#23492, #24222):
- スキーマの中に別のスキーマを作成可能。
CREATE SCHEMA finance.reports; CREATE TABLE finance.reports.q3 (revenue DECIMAL);
- 新しい変数構文(#21194):
- 式が許可される場所であれば
と表記でき、冗長な$x
が不要。getvariable()
- 式が許可される場所であれば
SET VARIABLE threshold = 100; SELECT * FROM orders WHERE amount > $threshold;
-
JSON 変換関数(#23786):
,json_set
,json_insert
,json_replace
で JSON のインプレイス修飾が可能。json_remove
-
再帰的 CTE と
アグリゲーション:USING KEY- 純粋な SQL による反復アルゴリズムの実行が可能に(#19481)。
WITH RECURSIVE tbl(a, b) USING KEY (a, avg(b)) AS ( SELECT 1, 5 UNION SELECT a, b - 1 FROM tbl WHERE b > 0 ) TABLE tbl;
- その他機能:
(#23533)、FETCH FIRST 2 ROWS ONLY
(#22456)、GROUP BY でのOVERLAY()
(#23644)、明確なUNNEST
セマンティクス (#24058) など。MERGE
5. 非同期 I/O の導入
S3 などのオブジェクトストレージ連携において、DuckDB の体験を根本的に向上させます。
-
対応範囲:
- エンジン全体で非同期 I/Oを実装。
- I/O レイヤーがクエリ処理レイヤーから独立し、大幅な並列性を実現。
-
対象フォーマット順:
- Parquet サポート(#23662)
- CSV (#23961)
- DuckDB 固有のファイル形式 (#24654)
- 非同期 Parquet ライト (#23283)
- 新しい MMAP/DIRECT_IO モード (#22988)
-
効果:
- 特にネットワークストレージにおいて劇的なクエリ速度の向上が見られます。
6. 全般的なクエリ速度の向上
ユーザーが変更を加えることなく、以下の最適化により既存クエリが高速化されています。
- ハイライト機能:
- 部分的アグリゲーションがジョインの下にプッシュ(#22572)
- 冗長なアグリゲーションの再利用(#24543)
- 再帰的 CTE エンジンの書き換え(#22211)
- メモリ超過時のディスク処理強化(#24499)
- Windows CLI のマルチスレッド結果マテリアライゼーションが約 2.2 倍高速化(#24036)
マイクロベンチマーク:再帰的 CTE
100 万の辺を持つグラフに対する到達可能ノード検索において、DuckDB v2.0 は約 40 倍の高速化を達成しました。
CREATE TABLE edges AS SELECT (range % 100_000)::INTEGER AS src, ((range * 13 + 7) % 100_000)::INTEGER AS dst FROM range(1_000_000); WITH RECURSIVE reachable(node) AS ( SELECT 0 UNION SELECT dst FROM edges, reachable WHERE src = node ) SELECT count(*) FROM reachable;
| バージョン | 実行時間 |
|---|---|
| DuckDB v1.5.4 | 4.90 s |
| DuckDB v2.0 (プレビュー) | 0.12 s |
行グループのトリミング(Row-Group Pruning)強化
以下のデータ型や条件でも効率的にデータをスキップできるようになりました。
- 最小・最大インデックス(ゾーンマップ)
- Parquet ブルームフィルター
- 構造化データ、リスト、小数点以下、UUID、IN フィルター、関数述語への対応
-- これらは今や効率的に処理されます SELECT * FROM logs WHERE contains(message, 'ERROR'); SELECT * FROM t WHERE substr(code, 1, 3) = 'NL-'; SELECT * FROM 'data/*.parquet' WHERE id IN (1, 5, 9);
クエリ計画とパーティション認識型(Partition-Aware)
- プランナーが既存のパーティションを最大限活用。
- データセット全体のスキャンか大部分のスキップかの決定的な違いを生みます。
- パーティション付きライティングも再設計されました(#22225, #22620)。
7. ストレージ形式 バージョン 2.0
デフォルトのストレージ形式が v2.0.0 にアップグレードされます(#22875)。
-
主な変更点:
- バッファー管理された ART インデックス (#21458, #23605)
- インデックスをメモリに固定し、大規模テーブルでも即座に開き、必要時だけページ単位で読み込み。
- カラムメタデータの遅延読み込み (#22333)
- 広範囲のテーブルも高速化。
- 辞書ベース圧縮
のデフォルト有効化 (#23733)DICT_FSST - 削除操作のコンパクトな格納(#24336)
- ストレージ層での強力な破損検出
- バッファー管理された ART インデックス (#21458, #23605)
-
効果:
- 大規模インデックスを持つデータベースや広範囲テーブルにおいて、開く速度向上とメモリ使用量の劇的な減少を実現。
8. 全新型 SQL パーサー
長年 PostgreSQL から派生したパーサーを使用しましたが、バージョン 2.0 で独自の現代的な PEG ベースのパーサー(#22194)へ移行します。
- 特徴:
- 拡張機能エコシステムと連携し、新しい SQL 構文を定義可能にします。
- 正確なソース位置を持つエラーメッセージ、最初のダイアレクト互換モードをサポート。
SET dialect_compatibility_mode = 'spark';
- 互換性:
- 設計上、旧来のクエリに対しては動作変化がないことを保証しています。
9. ICU ライブラリの廃止とネイティブ実装の採用
タイムゾーン、カレンダー、コラージョン機能の提供元を、ICU ライブラリから完全に変更。
- 変更内容:
拡張機能がタイムゾーンなどを担当(#24463, #24403)。icu- IANA データベースから直接構築され、約 45 KB に圧縮。
- 以前と同じ動作を保証しつつ、より小さく高速化。
ベンチマーク結果
MacBook 上の簡易テスト(タイムゾーン変換:2,500 万行 / コラージョン:500 万件)で以下の速度向上を記録。
| クエリ | v1.5.4 (ICU) | v2.0 (ネイティブ) | 速度向上 |
|---|---|---|---|
(2,500 万行) | 0.24 s | 0.11 s | 2.2 倍 |
(500 万件) | 0.15 s | 0.06 s | 2.6 倍 |
10. 拡張機能:一度記述すれば、ご自身でホスト可能
DuckDB の安定した C API が拡充され、拡張機能開発のパラダイムが変化します。
-
C API の安定化:
- 一度記述しビルドすれば、ほぼ永遠に動作し続ける仕組みを実現。
- 宣言的でバージョン管理された仕様(YAML)から生成(#24135)。
- 統一されたシンボルバージョニング、カスタムアロケーター、静的リンキング機能付き。
-
自己ホスト型拡張機能:
- 組織自らが拡張機能をホスト・署名し、組み込みのものと同じようにインストール可能に(#24777)。
#include "duckdb_extension.h" DUCKDB_EXTENSION_ENTRYPOINT(duckdb_connection con, ...) { // スカラー関数の登録処理 }
リポジトリの登録と利用
- 独自の信頼済みリポジトリを登録・使用できます。
- RSA 公開鍵による署名検証でセキュリティを保証。
- ローカルパス、HTTPS、S3 などをプレフィックスとして利用可能。
SET allow_extension_repositories = 'allowed'; -- リポジトリの作成と登録 CREATE EXTENSION REPOSITORY my_repo FROM 'https://extensions.example.org'; INSTALL my_ext FROM my_repo; LOAD my_repo/my_ext; -- オフライン環境や鍵ローテーション対応もサポート CREATE EXTENSION REPOSITORY my_repo FROM 's3://my-bucket/extensions' USING PUBLIC KEY '-----BEGIN PUBLIC KEY----- ...';
ボーナス:DuckDB Foundation アドバイザリーボード
秋から、利害関係者によるアドバイザリーボードが DuckDB Foundation に追加されます。
- 役割: DuckDB、DuckLake、および Quack の開発ロードマップに対する意見提言。
- 効果: 主要な利害関係者がプロジェクトの方向性に発言権を持ちます。
最終的な所見
本稿はプレビュー版であり、リリース直前の秋に詳細が若干変化することがあります。ただし、DuckDB v2.0 は新しいデフォルトストレージ形式やLambda 構文への移行など、いくつかの互換性のない変更点を含みます(リリースアナウンスメントにて詳しく説明)。
バージョン 1.5 以降、1 万回超のコミットとコミュニティの多大な貢献により、この大規模な進化が可能になりました。プレビュービルドで機能を確認し、Issues にご報告ください。