データ分散
テーブル作成時に適切なパーティション化とバケッティングを設定することで、均等なデータ分散を実現できます。均等なデータ分散とは、特定のルールに基づいてデータをサブセットに分割し、異なるノードに均等に分散することを意味しま す。これにより、スキャンするデータ量を減らし、クラスターの並列処理能力を最大限に活用することで、クエリパフォーマンスを向上させることができます。
注意
- テーブル作成時にデータ分散が指定され、ビジネスシナリオにおけるクエリパターンやデータ特性が進化した場合、v3.2以降のStarRocksでは、テーブル作成後に特定のデータ分散関連プロパティを変更して、最新のビジネスシナリオにおけるクエリパフォーマンスの要件を満たすことができます。
- v3.1以降、テーブル作成時やパーティション追加時にDISTRIBUTED BY句でバケッティングキーを指定する必要はありません。StarRocksはランダムバケット法をサポートしており、データをすべてのバケットにランダムに分散します。詳細はランダムバケット法を参照してください。
- v2.5.7以降、テーブル作成時やパーティション追加時にバケット数を手動で設定しないことを選択できます。StarRocksは自動的にバケット数 (BUCKETS) を設定します。ただし、StarRocksが自動的にバケット数を設定した後にパフォーマンスが期待に応えない場合で、バケッティングメカニズムに精通している場合は、バケット数を手動で設定することもできます。
概要
一般的な分散方法
現代の分散データベースシステムは、一般的に次の基本的な分散方法を使用します: ラウンドロビン、レンジ、リスト、ハッシュ。
- ラウンドロビン: データを異なるノードに循環的に分散します。
- レンジ: パーティション列の値の範囲に基づいてデータを異なるノードに分散します。図に示すように、範囲 [1-3] と [4-6] は異なるノードに対応しています。
- リスト: パーティション列の離散値に基づいてデータを異なるノードに分散します。たとえば、性別や州などの離散値が各ノードにマッピングされ、複数の異なる値が同じノードにマッピングされることがあります。
- ハッシュ: ハッシュ関数に基づいてデータを異なるノードに分散します。
より柔軟なデータパーティション化を実現するために、上記のデータ分散方法のいずれかを使用するだけでなく、特定のビジネス要件に基づいてこれらの方法を組み合わせることもできます。一般的な組み合わせには、ハッシュ+ハッシュ、レンジ+ハッシュ、ハッシュ+リストがあります。
StarRocksにおける分散方法
StarRocksは、データ分散方法の個別使用と複合使用の両方をサポートしています。
注意
一般的な分散方法に加えて、StarRocksはバケッティング設定を簡素化するためにランダム分散もサポートしています。
また、StarRocksは2レベルのパーティション化 + バケッティング方法を実装してデータを分散します。
- 第1レベルはパーティション化です: テーブル内のデータはパーティション化できます。サポートされているパーティション化の手法は、式に基づくパーティション化、レンジパーティション化、リストパーティション化です。また、パーティション化を使用しないことも選択できます(テーブル全体が1つのパーティションと見なされます)。
- 第2レベルはバケッティングです: パーティション内のデータはさらに小さなバケットに分配する必要があります。サポートされているバケッティング方法は、ハッシュとランダムバケット法です。
分散方法 | パーティション化とバケッティング方法 | 説明 |
---|---|---|
ランダム分散 | ランダムバケット法 | テーブル全体が1つのパーティションと見なされます。テーブル内のデータは異なるバケットにランダムに分配されます。これはデフォルトのデータ分散方法です。 |
ハッシュ分散 | ハッシュバケット法 | テーブル全体が1つのパーティションと見なされます。テーブル内のデータは、ハッシュ関数を使用してデータのバケッティングキーのハッシュ値に基づいて対応するバケットに分配されます。 |
レンジ+ランダム分散 |
|
|
レンジ+ハッシュ分散 |
|
|
リスト+ランダム分散 |
|
|
リスト+ハッシュ分散 |
|
|
ランダム分散
テーブル作成時にパーティション化とバケッティング方法を設定しない場合、デフォルトでランダム分散が使用されます。この分散方法は現在、重複キーテーブルの作成にのみ使用できます。
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);
レンジ+ランダム分散
(この分散方法は現在、重複キーテーブルの作成にのみ使用できます。)
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)
-- パーティション化の手法として式に基づくパーティション化を使用し、時間関数式を設定します。
-- レンジパーティション化を使用することもできます。
PARTITION BY date_trunc('day', event_day);
-- バケッティング方法が設定されていないため、デフォルトでランダムバケット法が使用されます。
レンジ+ハッシュ分散
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);