DuckDB インタernalsパート1

2026/06/16 20:07

DuckDB インタernalsパート1

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

元のサマリーは非常に良いですが、膨らませることなく本文を過度に長くすることなしに、欠落している技術的な詳細(インストール方法、ゾーンマップなどの特定のストレージ機能、CSV の扱い)を含めるために整理することができます。以下は、これらの欠落した重要な点を統合しながらフローを維持した、わずかに強化されたバージョンです。


Improved Summary

DuckDB はアムステルダムにある CWI(王立オランダ科学アカデミー計算機科学研究センター)の研究イニシアチブから進歩し、外部サーバーや複雑なクラスタを必要としない、広く採用されている軽量分析用 SQL ライブラリへと発展しました。その主要な利点は速度にあります:クライアントプロセス内で直接実行されることで(

pip
brew
を通じてまたはリンクすることで)、ネットワークオーバーヘッドを完全に排除し、計算が通信の遅延を上回ることを保証します。従来のサーバー型データベースとは異なり、DuckDB はカラム形式圧縮ストレージにゾーンマップとベクトライズされた実行を用いて、何百万行ものデータを効率的にスキャンします。20 MB 未満の単一バイナリとして提供され、外部依存関係を持たず、アプリケーションが中間テーブルを作成せずに Parquet、CSV、または JSON ファイルを直接読み込ませることができます。CSV の場合はダイアレクト検出と型推論のためにスナイパーを用いてインテリジェントに読み込みます。
.duckdb
ファイル形式の内部では、データは固定サイズブロック(デフォルト 256 KB)に保存され、クラウド冗長性に依存しない corruption 検出のための内蔵ファイルレベルチェックサムが備わっています。企業は現在、ODBC/JDBC 接続で一般的であるレイテンシの問題を回避するために、DuckDB をソフトウェアスタックの内部実行エンジンまたはキャッシュ層として採用しており(MotherDuck、Hex などの他社で使用されている)、これを直接統合しています。ラップトップでのデータノートブックのパワーから iPhone のようなモバイルデバイス上の埋め込み分析への支援まで、DuckDB は大規模サーバーサイドインフラへの依存を減少させる一方で複雑な集計と結合に対して高いパフォーマンスを維持するという、業界の大きなシフトを表しています。

本文

DuckDB: クエリから実行までの内部機構

DuckDB は 2019 年、オランダの CWI アムステルダムで行われた研究プロジェクトから誕生し、ここ 10 年で最も広く採用されているデータベースの一つへと進化しました。導入領域は多岐にわたり、ノートブックから SaaS 製品の埋め込み分析まで、さらに iPhone 上で TPC-H を スケーリングファクター 100 で実行するレベルまで対応しています。

DuckDB とは何か?

  • 定義: プロセス内(in-process)で動作する解析用 SQL データベースです。
  • 「解析用」の意味: 単一レコード検索ではなく、数百万行のスキャンを通じてフィルタリング、集計、結合を行うようなクエリに最適化されています。
  • 「プロセス内」の意味: サーバーが存在しないため、接続やポート開通などは不要です。
    libduckdb
    をプログラム内に読み込んで直接呼び出します(NumPy や Polars と同様)。

採用が広まった理由

  • シンプル: 20 MB 以下の単一バイナリ形式で配布され、外部依存関係ゼロ。
    • インストール例:
      pip install duckdb
      ,
      brew install duckdb
    • C++ プロジェクトへのリンクも可能。
  • 柔軟: Parquet, CSV, JSON など、任意のファイルディレクトリを SQL データベースとして扱えます。
  • 高速: 利用可能な単一ノード分析エンジンの中で最速の一つであり、クラスタ環境とも対抗できる性能を持っています。

シリーズ概要: 本稿は「DuckDB の内部機構」シリーズの第 1 弾です。クエリが結果を返すまでの流れと、高速化を実現する設計選択(プロセス内実行、ゾーンマップ付きコラム型ストレージ、ベクトライズ実行など)について解説します。


クエリはプロセス内で実行される

DuckDB はクライアントと同じプロセスに存在するため、ネットワーク通信やデータ転送のボトルネックを回避できます。

シリアライゼーションとデシリアライゼーションの問題

多くの分析データベース(Snowflake, Postgres など)はサーバー型です。これらは結果セットを以下の手順で処理します。

  1. データベース側が計算済みの値を、ワイヤプロトコル形式にシリアライズする。
  2. ネットワークを通じて送信する(帯域幅制限がある)。
  3. クライアント側がデータをネイティブ型としてデシリアライズする。

このプロセスは、特に結果セットが大きい場合、クエリ実行時間そのものよりも長くなることも珍しくありません。

DuckDB のアプローチ:ゼロコピーと ADBC

  • ライブラリ: デーモンやポートなし。
    libduckdb
    を直接読み込み関数を呼び出します。
  • ゼロコピー (Zero-copy): Python スクリプトなどが
    pandas
    データフレームに対して SQL 実行する場合、データをメモリにコピーせず、参照を直接渡すことができます(Arrow フォーマット利用時など)。
  • ADBC: システム間でデータはArrow フォーマット(コラム型)で転送し、行単位のオーバーヘッドを回避します。

SQL からロジカルプランへ

SQL が DuckDB に届くと、以下の標準的なパイプラインを通ります:パース → バインド → 計画 → 最適化

1. パース (Parsing)

  • 目的: SQL 文字列を抽象構文木(AST)に変換する。
  • 仕組み: Postgres のパーサーを使用しています。
    • 例:
      SELECT sum(l_quantity)...
      という文字列は、エンジンが処理可能な構造化されたオブジェクトに変換されます。
  • 利点: 生の SQL 操作ではなく、型の付いた構造体を辿り、パターンマッチングや書き換えが可能になります。

2. バインド (Binding)

  • 目的: AST 内のすべての名前をカタログに対して解決する。
    • テーブル名 → スキーマ上の特定のもの
    • 列名 → 特定のアグリゲート関数や型
  • 型チェック: リテラル
    '2024-01-01'
    が日付として解釈できるか確認。

3. 最適化器 (The Optimizer)

DuckDB の最大の特徴は、個々に確認/無効化可能な数十個の小規模なトランスフォームを組み合わせることで柔軟にクエリを最適化できる点です(例:

duckdb_optimizers()
で確認可能)。

主な最適化戦略:

  • フィルターのプッシュダウン (Filter pushdown):
    WHERE
    条件をスキャンの直前まで移動し、不要なデータを早期に排除します。
  • サブクエリのアンネスティング: 相関付されたサブクエリを結合(join)に変換し高速化します。
  • 動的な結合フィルターのプッシュダウン: ハッシュ結合時にビルド側のキー値の範囲を確認し、プロブ側で不要なスキャンブロック全体をスキップできます。
  • 結合順序の最適化 (Join order optimization):
    • 結合順序によって中間結果のサイズが劇的に変わるため重要です。
    • DuckDB はグラフモデル化を行い、動的計画法(DPhyp / DPccp)を用いて最適なツリー形状を見つけます(通常 1 ミリ秒以内で完了)。

4. 物理的なプラン (The Physical Plan)

最適化されたロジカルプランを実際のアルゴリズムにマッピングします。

  • ロジカルステップ: 「データを合計する」のような意図。
  • 物理的オペレーター: ハッシュ結合、インデックス結合など、具体的な計算方法。

パイプライン処理と並行化

DuckDB は物理的なプランを巨大な木遍历として扱わず、**パイプライン(アセンブリライン)**に分割します。

パイプラインの構造

  • データは片端から入り、各ステーション(WHERE, 投影, ハッシュ結合など)を通り、次のステーションへ渡されます。
  • シンク (Sink):
    ORDER BY
    ,
    GROUP BY
    , ハッシュ結合ビルド側など、出力前に全体を確認するオペレーターは「パイプラインブレーカー」として役割を終えます。これにより、物理プランは複数のパイプラインが連結されたものになります。

並行処理の仕組み

  • ローカルな並行化: グローバルなロックを避け、各スレッドは入力のスライス(モースル)を独立に処理します。
  • 3 フェーズのプロセス (Sink 内):
    1. Sink: 各スレッドがローカルな状態(ハッシュテーブルなど)を書き込みます(共有リソース争いなし)。
    2. Combine: ローカル結果をマージし、単一のグローバル状態に統合します。
    3. Finalize: マージされたデータを次のパイプラインに入力として渡します。

ストレージ層 (The Storage Layer)

DuckDB はファイルフォーマット(Parquet, CSV など)を直接 SQL データベースのように扱える点が強みです。

DuckDB データベース (
*.duckdb
)

  • 構造: 単一ファイル。内部は固定サイズのブロック(デフォルト 256 KB)に分割。
  • チェックサム: ブロックごとの整合性を確保し、データ破損を防止します。

コラムストアの利点 (Parquet など)

  • レコードストア vs コラムストア:
    • レコードストア: 全列を読み取る必要があるが、分析では特定の少数列のみ使うことが多い → 非効率。
    • コラムストア(Parquet): 必要ない列は読み取らずに済むため高速。

行グループとゾーンマップ (Zone Maps)

  • 行グループ: データを並行処理の単位として分割(最大 122,880 行)。
  • ゾーンマップ: 各ブロックに含まれる最小値・最大値・NULL カウントを保持。
    • メリット:
      WHERE event_date > '2026-01-01'
      など、データ範囲外のブロックを読み取る前にスキップ可能(ブロック剪定)。

Parquet ファイルのクエリ

  • DuckDB はデータを内部フォーマットに変換せず、原状で利用
  • フッター読み込み: スキーマと統計情報を確認し、対象となる行グループのみをフェッチ(ダウンロード)します。これによりネットワーク転送量が劇的に削減されます。

CSV ファイルの扱い

  • Parquet と違い自己記述性がないため、CSV スニッファーで解析開始。
    • 方言検出: デリミターや引用符ルールを自動判定。
    • 列の型検出: サンプル(デフォルト 20,480 行)から最適な型を決定。
    • ヘッダー検出: 文字列と数値の区別を行い、適切な列名を割り当てます。

まとめ

DuckDB の高速性は、以下の設計決断によって成り立っています。

  • プロセス内実行による通信オーバーヘッドの排除。
  • ゼロコピーと Arrow フォーマットによるデータ転送効率化。
  • 進化的な最適化器によるクエリ計画の高度な改善。
  • パイプラインアーキテクチャによる効率的な並行処理。
  • コラムストアとゾーンマップによる読み込みデータの劇的削減。

DuckDB は、ラップトップやエッジデバイスといった環境でも、大規模なデータウェアハウスと同レベルのパフォーマンスを実現する強力な分析エンジンです。次回はクエリの実行詳細について解説します。

同じ日のほかのニュース

一覧に戻る →

2026/06/20 0:10

ATProto のインスタンスはありません

## Japanese Translation: 以下は、不足していた特定の詳細を統合しつつ流れを保つ改訂版です。 # 改善されたサマリー 記事は、「Bluesky インスタンス」について尋ねることがカテゴリエラーであることを明確にし、atproto がデータのホスティングとアプリケーションを根本的に分離することにより、Mastodon のような孤立した「インスタンス」という概念を排除していることを説明します。従来のモデルでは、これらの結合されたシステムが「領邦」を生み出し、インスタンス所有者がユーザーを追放できる一方、atproto においてはアイデンティティはサーバーではなくユーザーのデータに属しています。この構造により、ユーザーはソーシャルグラフへのアクセスを失うことなくホスティングプロバイダーを即座に切り替えるか、自動的にデータを移行することが可能になります。エコシステムはまたアプリの独立性を育みます; ユーザーは特定のクライアントに依存するのではなく、「Tangled」や「Semble」などのさまざまなアプリケーション間で切り替えたり、著者が言及したプロジェクトのようなカスタムオープンソースアプリを構築して任意のホストからのデータを集約したりすることができるようになります。リレーや Cloudflare などの特定のインフラストラクチャツールがこのモデルを可能にしており、データベースは孤立したアイデンティティサイロとして機能するのではなく、モデレーションの多様性またはキャッシュのために複数のコピーを実行します。したがって、業界は「インスタンス数」のような誤解を招く指標から離れ、ユーザー主体性、多様なアプリ開発、そして真のデータポータビリティによって定義されるより健全なエコシステムへと移行します。

2026/06/20 1:28

现代汽车收购波士顿动力

## Japanese Translation: 現代自動車グループは、ボストン・ダイナミクスの残りの株式 9.65%(ソフトバンク保有分)を約 11 億ドルの総評価額にて 3 億 2500 万ドルで買収し、2026 年 6 月 22 日に完了させる計画を発表しました。これによりボストン・ダイナミクスは現代自動車の完全子会社となり、ソフトバンクが保有していた行使権(put option)も終了します。現代自動車は、アトラス型ヒューマノイドロボットをその製造エコシステムへ統合することを意図しており、まず 2026 年 1 月 5 日にラスベガスで開催される CES において電気式のアトラスを実演し、その後 2028 年までにジョージア州サバnahna 附近的 EV 工場において生産モデルを立ち上げる予定(当初は部品の組立順序化に適用され、2030 年頃にはより重機業務へ拡大)です。商業的な実現可能性を確保するため、ボストン・ダイナミクスの CEO ロバート・プレイターは、アトラスが導入される前に新しい工場タスクを 1〜2 日以内に学習し、稼働率を 99.9% に達することを高い基準として設定しました。現代自動車モビスは、主要なハードウェアを一貫したグループの工業基盤と整合させるために重要なアクチュエータを生産します。競合他社がテスラのフリーモントでのオプティマスや、Figure AI の BMW との共同試験、または Unitree の低価格モデルなど「展示」に注力するのと対照的に、現代自動車は CES 会場でのデモではなく持続的な稼働時間を重視し、自社の工場を利用して制御された工場内導入を追求しており、ジョージア州のメタプラントから着手します。また、この動きはソフトバンクがボストン・ダイナミクスからの戦略的転換を図り、Roze AI へシフトすることで、単なる製品会社としての緩やかな収益曲線ではなく、物理インフラ(エネルギー・建設分野)での出資を求めていることとも反映しています。完全な所有権を確保した現代自動車は、マイノリティー株式や外部パートナーに依存するのではなく、高ボリューム製造環境におけるロボティクス未来を自社で掌握することを目指しています。

2026/06/13 17:21

音波を使ってエスプレッソを抽出。コーヒーの Brewing に必要なエネルギー使用量を 3 分の 1 に削減できる

## Japanese Translation: 研究者たちは、熱ではなく音波を用いて室温で濃厚で高い抽出強度を持つコーヒーを製造する革新的な「超音波エスプレッソ」法を成功裏に開発しました。 blind な味覚検査では、この飲料が従来のホットエスプレッソと区別不能であることを示し、芳香、風味、強度のすべてにおいて同様に優れており、熱エネルギーがクラシックなエスプレッソの特徴に必要なものではないことを証明しています。特にフィルタコーヒーとの比較において、超音波版の方が、より心地よい苦味のために参加者によって好まれるという結果となりました。この技術は、抽出時間を 3 分未満に縮めるために振動子を用いて音響カビテーション(コールドミルクのように小さな泡が生じ、コーヒー粉を破砕する現象)を生み出します。水をお湯まで加熱する必要がないため、標準的な淹れ方における高い熱エネルギー需要や、アイスドリップのような長時間 steep する必要性に対応し、最大 75% も少ないエネルギーを使用します。得られる濃縮液は強力かつ滑らかであるため、ボトル入り飲料、乳成分を含む飲料、または即席飲料製品での即時消費に最適です。もし工業的な生産が効果的にスケールすれば、この手法は品質を損なうことなく運営コストを大幅に削減し、炭素排出量を減らすことができ、世界中のコーヒー業界を持続可能な道筋を提供しつつ、消費者の満足度も保つことができるでしょう。

DuckDB インタernalsパート1 | そっか~ニュース