メインコンテンツまでスキップ

Understand StarRocks table design

テーブルの設計を理解する

列指向ストレージ

列指向ストレージ

StarRocksでは、他のリレーショナルデータベースと同様に、テーブルは行と列で構成されています。各行はユーザーデータのレコードを保持し、各列のデータは同じタイプです。テーブルのすべての行は同じ数の列を持ちます。テーブルには列を動的に追加したり削除したりすることができます。テーブルの列は次元列とメトリック列に分類されます。次元列はキーカラムとも呼ばれ、メトリック列は値カラムとも呼ばれます。次元列の値はデータをグループ化および並べ替えるために使用され、メトリック列の値はsum、count、min、max、hll_union_agg、bitmap_unionなどの関数を使用して蓄積することができます。

StarRocksは、テーブルに対して列指向のストレージを使用します。物理的には、列内のデータはデータブロックに分割され、エンコードされ、圧縮され、その後ディスクに永続的に保存されます。論理的には、列内のデータは、同じデータ型の要素からなる配列と比較することができます。行に保持されている列の値は、それぞれの配列内の要素として列の順序に従ってリストされます。つまり、行に保持されている列の値は同じ配列インデックスを持っています。配列インデックスは暗黙的であり、格納する必要はありません。テーブルのすべての行は、1つまたは複数の次元列で指定された順序でソートされます。ソートされたテーブル内の行の位置は、その行のシーケンス番号で表されます。

テーブルのクエリでは、特定の次元列に対する等価または範囲条件を指定すると、StarRocksはソートされたデータの中から関心のある行を迅速にロケートするためにバイナリサーチを実行できます。例えば、table1というテーブルからデータをクエリしたい場合、テーブルはevent_daysiteidcitycodeusernameという4つの列から構成されていますが、そのうちevent_daysiteidは次元列です。クエリ条件としてevent_day = 2020-09-18およびsiteid = 2を指定した場合、StarRocksはバイナリサーチを実行し、指定された範囲内のデータのみを処理する必要があります。なぜなら、event_daysiteidは次元列のプレフィックスを構成することができるからです。一方、citycode = 4およびusername = Andyをクエリ条件として指定した場合、StarRocksはバイナリサーチを実行することができず、テーブル全体のデータを処理する必要があります。なぜなら、citycodeusernameは次元列のプレフィックスを構成することができないからです。

インデックス

StarRocksでは、接頭辞インデックスと列インデックスを使用して、関心のある行のデータブロックの開始行を素早くロケートします。

次の図は、StarRocksのテーブル設計がテーブルのクエリを高速化する方法を示しています。

インデックスの概要

StarRocksのテーブルのデータは、次の3つの部分に組織されています。

  • 接頭辞インデックスStarRocksでは、1024行ごとにデータブロックとしてデータを保持し、接頭辞インデックステーブルにエントリが維持されます。各データブロックの接頭辞インデックスエントリの内容は、データブロックの開始行の次元列から構成される接頭辞であり、長さは36バイトを超えることはありません。接頭辞インデックスはスパースインデックスです。行をクエリする場合、StarRocksは接頭辞インデックステーブルを検索して、行の次元列で構成される接頭辞を検索します。その後、StarRocksは関心のある行が含まれるデータブロックのシーケンス番号を迅速にロケートすることができます。
  • 列ごとのデータブロックStarRocksは、各列のデータを複数の64KBのデータブロックに分割します。各データブロックは独立してエンコードおよび圧縮され、最小のI/O単位としてディスクから読み取られまたは書き込まれます。
  • 列インデックスStarRocksは、各列ごとに行番号インデックスを維持します。行番号インデックステーブルでは、列のデータブロックが列に保持されている行のシーケンス番号に1対1でマッピングされます。さらに、行番号インデックステーブルの各エントリは、特定の行番号にマッピングされるデータブロックの開始行番号、アドレス、および長さで構成されています。行をクエリする場合、StarRocksは行番号インデックステーブルを検索して、行のシーケンス番号にマッピングされるデータブロックのアドレスを取得します。その後、StarRocksはデータブロックを読み取って行をロケートします。

要約すると、StarRocksは次元列のプレフィックスで構成される接頭辞を使用して、テーブルの行をロケートするために次の5つのステップを実行します。

  1. 接頭辞インデックステーブルを検索して、関心のある行が含まれるデータブロックの開始行のシーケンス番号をロケートします。
  2. 各次元列の行番号インデックステーブルを検索して、次元列のデータブロックをロケートします。
  3. データブロックを読み取ります。
  4. データブロックを展開およびデコードします。
  5. データブロックを検索して、次元列インデックスにマッピングされる行をロケートします。

高速処理

このセクションでは、StarRocksがデータを高速に処理するためのメカニズムについて説明します。

プリ集約

StarRocksでは、集約テーブルを提供しています。集約テーブルでは、テーブルの次元列の値が同じ行は1つの行に集約されます。集約から生成された新しい行では、各次元列の値は変わらず、各メトリック列の値は指定した集約関数によって集約されてメトリック列の結果値が生成されます。プリ集約は、集約操作の高速化に役立ちます。

パーティショニングとバケティング

StarRocksの各テーブルは複数のタブレットに分割されます。各タブレットはBE上の複数のレプリカに格納されます。BEの数とタブレットの数は、計算リソースとデータサイズの変更に応じて柔軟にスケーリングできます。クエリを開始すると、複数のBEが並列でタブレットを検索して関心のあるデータを素早くロケートすることができます。また、タブレットのレプリカは複製および移行が可能であり、データの信頼性を向上させデータの偏りを防ぎます。パーティショニングとバケティングにより、データの検索の効率と安定性が確保されます。

マテリアライズドビュー

テーブルの接頭辞インデックスは、テーブルの次元列のシーケンスに依存してクエリを高速化するのに役立ちます。次元列プレフィックスに含まれていない次元列を使用してクエリ述語を構築する場合、接頭辞インデックスは機能しません。この場合、テーブルのためにマテリアライズドビューを作成することができます。マテリアライズドビューのデータは、テーブルのデータと同じ方法で組織化されて格納されます。ただし、マテリアライズドビューは独自の接頭辞インデックスを持つことができます。マテリアライズドビューのために接頭辞インデックスを作成する際には、適切な集約性、列数、および次元列の順序を指定して、頻繁に使用されるクエリ条件がマテリアライズドビューの接頭辞インデックステーブルの期待されるエントリにヒットすることを保証することができます。

列ごとのインデックス

StarRocksは、Bloomフィルター、ゾーンマップ、ビットマップインデックスなどの列ごとのインデックスをサポートしています:

  • Bloomフィルターは、データブロックがクエリしたい値を含んでいるかどうかを判断するために使用されます。
  • ゾーンマップは、指定した範囲内の値を特定するために使用されます。
  • ビットマップインデックスは、ENUMデータ型の列内で指定したクエリ条件を満たす行を特定するために使用されます。