0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【データベース製品紹介 (3/10)】Vertica - C-Store論文から紐解く「射影」とアーキテクチャの神髄

Posted at

はじめに

「データベース製品紹介」シリーズへようこそ!第1回のClickHouse編、第2回のApache Doris編に続き、シリーズ第3弾をお届けします。

今回は、商用分析データベースの草分け的存在であり、その設計思想が現代の多くのデータベースに影響を与えた「Vertica」を取り上げます。

Verticaを単なる製品として紹介するのではなく、その源流である2005年の学術プロジェクト「C-Store」に関する著名な論文『The Vertica Analytic Database: C-Store 7 Years Later』を参考文献とし、その核心的なアーキテクチャと強さの秘密に迫ります。

対象読者

  • データベースの内部アーキテクチャに強い興味がある方
  • カラムナデータベースがなぜ高速なのか、その理論的背景を知りたい方
  • Verticaの「射影(Projection)」という概念を正しく理解したい方
  • Michael Stonebraker氏の研究に興味がある方

Verticaとは?

Verticaは、共有ディスク型または共有なし(Shared-Nothing)型のMPPアーキテクチャを採用した、列指向の分析データベースです。そのルーツは、データベース界のノーベル賞とも言われるチューリング賞を受賞したMichael Stonebraker氏らが主導した研究プロジェクト「C-Store」にあります。

C-Storeの論文で提唱された革新的なアイデアを商用製品として結実させたのがVerticaであり、「分析クエリのパフォーマンスを極限まで高める」という一点に徹底的にフォーカスした設計が特徴です。

主な特徴

特徴 説明
列指向ストレージ C-Storeプロジェクトの中核的なアイデア。データを列ごとに格納・圧縮します。
射影 (Projection) データを物理的に格納する主要な形式。テーブルとは異なる、クエリに最適化された列の集合です。
高いデータ圧縮率 列指向と積極的なエンコーディングにより、ストレージコストを大幅に削減します。
MPPアーキテクチャ Shared-Nothingアーキテクチャでクラスタを構成し、クエリを並列実行することで高いパフォーマンスとスケーラビリティを実現します。
K-Safety 組み込みのHA機能。データのコピーをクラスタ内の複数ノードに分散配置することで、K個のノード障害に耐えられます。

C-Store/Verticaのアーキテクチャ:論文から学ぶ核心概念

Verticaの速さの秘密は、単に「列指向だから」という言葉だけでは説明できません。C-Store論文で示された、以下の独創的な概念の組み合わせによって実現されています。

1. 主たるデータ格納形式「射影(Projection)」

これがVerticaを理解する上で最も重要な概念です。
多くのDBでは、CREATE TABLEで定義した「テーブル」が論理的な構造であると同時に、物理的なデータの格納単位にもなっています。しかし、Verticaは違います。

Verticaでは、データは「テーブル」ではなく「射影(Projection)」という形式で物理的にディスクに格納されます。

  • 射影とは?: 特定のクエリを高速化するために最適化された、列の集合とそのソート順を定義したオブジェクトです。射影は、元となるテーブルの一つ以上の列を含みます。
  • 役割:
    • データ格納: テーブルはあくまで論理的な定義に過ぎず、全てのデータは1つ以上の射影の中に格納されます。
    • クエリ最適化: クエリオプティマイザは、与えられたクエリを最も効率的に処理できる射影を自動的に選択します。クエリが必要とする列が全て含まれ、かつ適切な順序でソートされている射影があれば、ディスクI/Oとソート処理を最小限に抑え、劇的なパフォーマンス向上を実現できます。

例:

productsテーブルがあったとします。

CREATE TABLE products (
    product_id INT,
    product_name VARCHAR(128),
    category_id INT,
    price DECIMAL(10, 2)
);

このテーブルに対し、以下のような複数の射影を作成できます。

-- 全ての列を含み、product_idでソートされた射影(スーパープロジェクション)
CREATE PROJECTION products_super_proj /* ( columns ... ) */
AS SELECT * FROM products ORDER BY product_id;

-- カテゴリごとの価格分析クエリを高速化するための射影
CREATE PROJECTION products_category_price_proj (
    category_id,
    price_encoded ENCODING RLE, -- price列をRLEでエンコード
    product_id
)
AS SELECT category_id, price, product_id FROM products
ORDER BY category_id;

クエリがcategory_idで絞り込み、priceを集計する場合、オプティマイザは2番目のproducts_category_price_projを選択します。これにより、不要なproduct_name列を読み込むことなく、かつ事前にcategory_idでソートされたデータを効率的にスキャンできます。

2. 書き込みと読み込みの分離:WOSとROS

列指向データベースは、圧縮やソートが施されているため、読み取りは高速ですが、追記や更新(書き込み)は苦手です。この課題を解決するのが、WOSROSという2層のストレージ構造です。

[COPY command] -> [ WOS (メモリ, 行指向) ] --(Tuple Mover)--> [ ROS (ディスク, 列指向, 圧縮済) ]

  • WOS (Write Optimized Store)

    • メモリ上に確保される、行指向の小さなストレージ領域です。

    • INSERTCOPYなどのDML操作は、まずこのWOSに対して行われます。WOSはソートも圧縮もされていないため、書き込みは非常に高速です。

    • クエリ実行時、オプティマイザはROSのデータとWOSのデータを結合して結果を返します。

  • ROS (Read Optimized Store)

    • ディスク上に永続化される、本来のデータ格納領域です。

    • データは射影の定義に基づき、列指向で格納され、高度に圧縮・ソートされています。読み取りパフォーマンスは最大化されています。

  • Tuple Mover

    • WOSに溜まったデータを、定期的にROSへと移動させるバックグラウンドプロセスです。

    • このプロセスが、データを列指向に変換し、ソートし、圧縮して、ROSコンテナとしてディスクに書き出します。

このアーキテクチャにより、Verticaは高速なデータロードと高性能な分析クエリを両立させているのです。

3. 可用性の担保:K-Safety

Verticaは、クラスタレベルでの高可用性を実現するためにK-Safetyという仕組みを組み込んでいます。

  • 概念: Kは、許容できるノード障害の数を表します。K=1に設定した場合、クラスタ内のどの1ノードがダウンしても、サービスは継続し、データも失われません。

  • 仕組み: テーブル作成時、各射影のデータはクラスタ内の複数のノードに分散配置されます(これをセグメンテーションと呼びます)。K-Safetyを有効にすると、各データセグメントのコピー(Buddy Projection)が、別のノードにも配置されます。ノードがダウンすると、Verticaは自動的にBuddy Projectionを使ってクエリに応答し続けます。

4. 自動物理設計ツール:Database Designer (DBD)

「どのクエリのために、どんな列とソート順を持つ射影を設計すればいいのか?」 これを人間が最適に設計するのは非常に困難です。そこでVerticaは、Database Designer (DBD) という強力なツールを提供しています。

DBDは、テーブル定義、サンプルデータ、そして代表的なクエリ群をインプットとして与えると、それらを分析し、最適な射影の設計(どの列を含めるか、ソート順、エンコーディング方式など)をCREATE PROJECTION文として自動生成してくれます。これにより、ユーザーはデータベースの物理設計の複雑さに頭を悩ませることなく、高いパフォーマンスを引き出すことができます。

まとめ

今回は、C-Store論文を元にVerticaのアーキテクチャを深掘りしました。

  • Verticaの核心は、論理テーブルと物理格納を分離し、クエリに最適化された「射影」としてデータを格納する点にある。

  • WOS(書き込み用)とROS(読み取り用)という2層構造と、それらを繋ぐTuple Moverにより、高速なロードと分析を両立している。

  • K-Safetyによる高可用性や、Database Designerによる物理設計の自動化など、商用データベースとしてエンタープライズ用途に耐えうる機能が充実している。

Verticaは、単なるカラムナデータベースではなく、パフォーマンスを極限までチューニングするための洗練されたアーキテクチャとツール群を備えた、まさに「分析のためのエンジン」です。その設計思想は、データベース技術の奥深さを教えてくれます。

次回予告

「データベース製品紹介」シリーズ、第4回は「Cassandra」をご紹介します。お楽しみに!

この記事が役に立った、面白かったという方は、ぜひいいねフォローをよろしくお願いします!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?