Data distribution
データディストリビューション
適切な分割とバケッティングの設定は、均等なデータディストリビューションを実現するのに役立ちます。均等なデータディストリビューションとは、データを特定のルールに従い、異なるノードに均等に分割することを意味します。これにより、スキャンするデータ量が減少し、クラスタの並列処理能力を最大限に活用して問い合わせのパフォーマンスを向上させることができます。
注意
- v3.1以降は、テーブルの作成やパーティションの追加時にDISTRIBUTED BY句でバケッティングキーを指定する必要はありません。StarRocksはランダムバケッティングをサポートしており、データをランダムにすべてのバケットに分散することができます。詳細については、ランダムバケッティングを参照してください。
- v2.5.7以降、テーブルやパーティションの作成時にバケット数を手動で設定する必要はありません。StarRocksは自動的にバケット数(BUCKETS)を設定することができます。ただし、StarRocksによる自動的なバケット数の設定後にパフォーマンスが期待通りでない場合や、バケッティングメカニズムに詳しい場合は、バケット数の手動設定を参照して手動でバケット数を設定することもできます。
ディストリビューションの方法
一般的なディストリビューションの方法
現代の分散データベースシステムでは、一般的に次の基本的なディストリビューション方法が使用されます。ラウンドロビン、範囲、リスト、ハッシュです。
- ラウンドロビン:データを循環的に異なるノードに分散します。
- 範囲:パーティショニングの列の値の範囲に基づいてデータをさまざまなノードに分散します。図に示すように、範囲[1-3]と[4-6]は異なるノードに対応しています。
- リスト:パーティショニングの列の離散値(性別、都道府県など)に基づいてデータをさまざまなノードに分散します。各離散値はノードにマップされ、複数の異なる値が同じノードにマップされることがあります。
- ハッシュ:ハッシュ関数に基づいてデータをさまざまなノードに分散します。
より柔軟なデータパーティショニングを実現するために、これらのデータディストリビューション方法のうちの1つを使用するだけでなく、特定のビジネス要件に基づいてこれらの方法を組み合わせることもできます。一般的な組み合わせには、Hash+Hash、Range+Hash、Hash+Listなどがあります。
StarRocksでのディストリビューション方法
StarRocksは、データディストリビューション方法の個別および複合の使用をサポートしています。
注意
ジェネラルなディストリビューション方法に加えて、StarRocksはランダムディストリビューションもサポートしており、バケッティングの設定を簡素化します。
また、StarRocksは2 レベルのパーティショニング+バケッティングメソッドを実装してデータを分散させます。
- 第1レベルはパーティショニングです:テーブル内のデータをパーティションに分割することができます。サポートされているパーティショニングメソッドは、式パーティショニング、範囲パーティショニング、リストパーティショニングです。または、パーティションを使用しないことも選択できます(テーブル全体を1つのパーティションと見なします)。
- 第2レベルはバケッティングです:パーティション内のデータをさらに小さなバケットに分散する必要があります。サポートされているバケッティングメソッドは、ハッシュバケッティングとランダムバケッティングです。
ディストリビューション方法 | パーティショニングとバケッティングの方法 | 説明 |
---|---|---|
ランダムディストリビューション | ランダムバケッティング | テーブル全体が1つのパーティションと見なされます。テーブルのデータはランダムに異なるバケットに分散されます。これはデフォルトのデータディストリビューション方法です。 |
ハッシュディストリビューション | ハッシュバケッティング | テーブル全体が1つのパーティションと見なされます。テーブルのデータは、ハッシュ関数を使用してバケット化キーコラムのハッシュ値に基づいて対応するバケットに分散されます。 |
範囲+ランダムディストリビューション |
|
|
範囲+ハッシュディストリビューション |
|
|
リスト+ランダムディストリビューション |
|
|
リスト+ハッシュディストリビューション |
|
|
-
ランダムディストリビューションテーブルの作成時やパーティションの追加時にパーティショニングメソッドとバケッティングメソッドを設定しない場合、デフォルトでランダムディストリビューションが使用されます。このディストリビューション方法は、Duplicate Keyテーブルを作成する場合に使用されます。
CREATE TABLE site_access1 (
event_day DATE,
site_id INT DEFAULT '10',
pv BIGINT DEFAULT '0' ,
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT ''
)
DUPLICATE KEY (event_day,site_id,pv); -- パーティショニングメソッドとバケッティングメソッドが設定されていないため、デフォルトでランダムディストリビューションが使用されます。 -
ハッシュディストリビューション
CREATE TABLE site_access2 (
event_day DATE,
site_id INT DEFAULT '10',
city_code SMALLINT,
user_name VARCHAR(32) DEFAULT '',
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY (event_day, site_id, city_code, user_name)
-- バケッティングメソッドとバケッティングキーを指定する必要があります。
DISTRIBUTED BY HASH(event_day,site_id); -
範囲+ランダムディストリビューション(このディストリビューション方法は、現在、Duplicate Keyテーブルを作成する場合にのみ使用できます。)
CREATE TABLE site_access3 (
event_day DATE,
site_id INT DEFAULT '10',
pv BIGINT DEFAULT '0' ,
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT ''
)
DUPLICATE KEY(event_day,site_id,pv)
-- パーティショニングメソッドとバケッティングメソッドを指定しない場合、デフォルトでランダムバケッティングが使用されます。 -
範囲+ハッシュディストリビューション
CREATE TABLE site_access4 (
event_day DATE,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY date_trunc('day', event_day)
-- バケッティングメソッドとバケッティングキーを指定する必要があります。
DISTRIBUTED BY HASH(event_day, site_id);
パーティショニング
パーティショニングメソッドは、テーブルを複数のパーティションに分割します。パーティショニングは主に、パーティションキーに基づいてテーブルを異なる管理ユニット(パーティション)に分割するために使用されます。各パーティションに対してストレージ戦略を設定できます。ストレージ戦略には、バケットの数、ホットなデータとコールドなデータの保存戦略、ストレージメディアの種類、レプリカの数などが含まれます。StarRocksでは、クラスタ内でさまざまな種類のストレージメディアを使用できます。たとえば、クエリのパフォーマンスを向上させるために最新のデータをSSDに保存し、ストレージコストを削減するために過去のデータをSATAハードディスクに保存することができます。
パーティショニングメソッド | シナリオ | パーティションの作成方法 |
---|---|---|
式パーティショニング(推奨) | 前のバージョンでは自動パーティショニングとして知られていました。このパーティショニングメソッドはより柔軟で使いやすく、連続した日付範囲またはenum値に基づいてデータをクエリおよび管理する場合など、ほとんどのシナリオに適しています。 | データの読み込み時に自動的に作成されます |
範囲パーティショニング | シン プルで順序付けられたデータを保存し、連続した日付/数値の範囲に基づいて頻繁にクエリおよび管理されるデータ。たとえば、特定のケースでは、過去のデータを月で分割する必要があるが、最近のデータを日ごとに分割する必要がある場合があります。 | 手動で、動的にまたは一括で作成できます |
リストパーティショニング | 列挙値に基づいてデータのクエリと管理を行う一般的なシナリオで、パーティショニング列の値毎に異なる値を含める必要がある場合に使用します。たとえば、国や都市に基づいて頻繁にデータのクエリと管理を行う場合、この方法を使用し、 | 手動で作成します |