DuckDB が高速な理由(第1部)

原題: DuckDB Internals: Why Is DuckDB Fast? (Part 1)

なぜ重要か

DuckDB は単一ノードで大規模クラスタと同等の分析性能を実現し、エンタープライズから個人開発者まで幅広い層に採用される基盤技術となっている。その設計原理の理解は、現代的なデータベースシステムの最適化技術を学ぶ上で重要である。

DuckDB は 2019 年の CWI アムステルダムの研究プロジェクトから、過去 10 年で最も採用されたデータベースの一つに成長した。インプロセス実行、列指向圧縮ストレージ、ベクトル化実行などの設計により、単一ノードで数百万ドルのクラスタと同等の性能を実現している。本記事は 3 部構成の技術深掘りの第 1 部で、DuckDB の高速性を実現する設計について解説する。

DuckDB は 2019 年にアムステルダム大学の研究プロジェクトから始まり、現在ではノートブック、ETL パイプライン、ダッシュボード、CI テストランナー、SaaS 製品内の組み込み分析など、幅広い場で使用されている。MotherDuck はクラウドデータウェアハウスとして展開し、Hex、Omni、Evidence などの BI・データアプリプラットフォームは実行エンジンとしてメモリ内キャッシュとして利用している。Fivetran のマネージドデータレイクサービスでは、DuckDB を使用してマージと圧縮を実行している。

DuckDB はインプロセス型の分析用 SQL データベースで、20 MB 未満の単一バイナリで提供され、外部依存関係がない。Parquet、CSV、JSON ファイルの任意のディレクトリを SQL データベースのように扱うことができる。サーバーが不要で、NumPy や Polars のようにライブラリとしてプログラム内に読み込まれる。

高速性の源は複数の設計選択にある。第一に、インプロセス実行により、結果をネットワークプロトコルにシリアライズして送信し、クライアント側でデシリアライズする処理が不要になる。Snowflake や Postgres などのサーバー型データベースでは、各レコードを合意されたバイト形式に書き換えて TCP ソケットを通じて送信する必要があるが、DuckDB ではこれが不要である。

その他の高速化要素として、列指向の圧縮ストレージ、ベクトル化実行、モーセル駆動型並列化、スナップショット分離を用いた楽観的 MVCC などが挙げられる。本記事は SQL がエンジンに入力されてから実行準備が完了するまでの経路と、クエリが読み取るストレージレイヤーについて解説する。実際のクエリ実行については第 2 部で扱う予定となっている。

出典

greybeam.ai — 元記事を読む →