/note/tech

DuckDB - SQLite競合の組込みRDBMS

SQLiteに似た組込み型のRDBMSプロダクト。オープンソースでオランダの公務員が開発しているとのこと。

SQLiteよりデータ型が豊富なところやそれらデータ型向けの関数が豊富なところは優位性があると思う。

多くのデータベース管理システム(DBMS)が存在します。しかし、すべてのデータベースシステムに当てはまるワンサイズのものはありません。すべてのシステムは、特定のユースケースにうまく適応するために、異なるトレードオフを取っています。DuckDBも例外ではありません。ここでは、DuckDBがどのような目標を持っているのか、その理由は何なのか、そして技術的な手段でどのように目標を達成しようとしているのかを説明しようとしています。そもそもDuckDBは、構造化クエリ言語(SQL)をサポートするリレーショナル(テーブル指向)DBMSです。

高速な分析クエリ

DuckDBは、オンライン分析処理(OLAP)としても知られる分析クエリのワークロードをサポートするように設計されています。これらのワークロードは、テーブル全体の集計や複数の大きなテーブル間の結合など、保存されたデータセットの大部分を処理する複雑で比較的長時間のクエリが特徴です。データへの変更もまた、数行の追加や、テーブルの大部分が同時に変更または追加されるなど、かなり大規模なものになることが予想されます。

このような作業負荷を効率的にサポートするためには、個々の値ごとに消費されるCPUサイクルの量を減らすことが重要です。これを実現するためのデータ管理の最新技術は、ベクトル化されたクエリ実行エンジンまたはジャストインタイムのクエリ実行エンジンです。DuckDBには列ベクトル化されたクエリ実行エンジンが搭載されており、クエリは解釈されますが、1つの値(「ベクトル」)からの大量の値が1回の操作で処理されます。これにより、PostgreSQL、MySQL、SQLiteのように各行を順次処理する従来のシステムに見られるオーバーヘッドが大幅に削減されます。ベクトル化されたクエリ実行は、OLAPクエリのパフォーマンスをはるかに向上させます。

簡単操作

SQLite は世界で最も広く導入されている DBMS です。インストールが簡単で、プロセス内に組み込まれた操作が成功の鍵を握っています。DuckDBは、これらのシンプルさと組み込み操作の考え方を採用しています。

DuckDBには、コンパイル時もランタイム時も外部からの依存関係がありません。リリースでは、DuckDBのソース・ツリー全体が、ヘッダと実装ファイルの2つのファイルにコンパイルされ、いわゆる「アマルガム」と呼ばれています。これにより、デプロイや他のビルドプロセスへの統合が大幅に簡素化されます。ビルドに必要なのは、DuckDBのビルドに必要なすべてのものは、動作するC++11コンパイラです。

DuckDBの場合、インストール、更新、保守のためのDBMSサーバ・ソフトウェアは必要ありません。DuckDBは独立したプロセスとして実行されるのではなく、完全にホスト・プロセスに組み込まれています。DuckDBがターゲットとする分析的なユースケースでは、データベースとの間のデータ転送が高速であるという利点があります。いくつかのケースでは、DuckDBはコピーせずに外部データを処理することができます。例えば、DuckDBのPythonパッケージは、データをインポートしたりコピーしたりすることなく、Pandasデータ上で直接クエリを実行することができます。

豊富な機能

DuckDBは本格的なデータ管理機能を提供します。大規模な関数ライブラリやウィンドウ関数など、SQLによる複雑なクエリを幅広くサポートしています。DuckDBは、バルク最適化されたカスタムのマルチバージョン同時実行制御(MVCC)により、トランザクション保証(ACIDプロパティ)を提供します。データは、永続的な単一ファイル・データベースに格納することができます。DuckDBはセカンダリ・インデックスをサポートしており、単一のテーブル・エントリを検索しようとするクエリを高速化します。

DuckDBはPythonとRに深く統合されており、効率的なインタラクティブなデータ分析を実現します。DuckDBはJava、C、C++などのAPIを提供しています。

徹底したテスト

DuckDBは研究グループによって作成されたものですが、研究用のプロトタイプであることを意図したものではありません。DuckDBは安定した成熟したデータベースシステムであることを意図しています。

この安定性を促進するために、DuckDBは継続的インテグレーションを使用して集中的にテストされています。DuckDBのテストスイートには現在数百万のクエリが含まれており、SQLite、PostgreSQL、MonetDBのテストスイートから適応されたクエリも含まれています。テストは、さまざまなプラットフォームやコンパイラで繰り返し行われます。すべてのプルリクエストは、完全なテスト設定と照らし合わせてチェックされ、合格した場合にのみマージされます。

このテスト・スイートに加えて、高負荷時にDuckDBにストレスを与える様々なテストを実行しています。TPC-HおよびTPC-DSベンチマークを実行し、DuckDBを多数のクライアントが並列に使用する様々なテストを実行しています。

フリー&オープンソースライセンス

DuckDBの主な開発者はオランダの公務員です。私たちの給料は税金から支払われています。私たちは、私たちの仕事の成果をオランダや他の国の誰でも自由に利用できるようにすることが、社会に対する私たちの責任であり義務であると考えています。そのため、DuckDBは非常に寛容なMITライセンスのもとでリリースされています。DuckDBはオープンソースであり、ソースコード全体はGitHubで自由に利用できます。私たちは、私たちの行動規範を守ることを条件に、誰でも貢献を募っています。