List partitioning
リストパーティショニング
v3.1以降、StarRocksはリストパーティショニングをサポートしています。データは、各パーティションごとの予め定義された値リストに基づいてパーティション分割され、クエリの加速と列挙値に基づいた管理が容易になります。
概要
各パーティションで列値リストを明示的に指定する必要があります。これらの値は、Range Partitioningのように連続性を必要とせず、データのローディング中にStarRocksはデータを対応するパーティションに基づいて事前定義された列の値とデータのパーティショニング列の値のマッピングによってデータを格納します。
リストパーティショニングは、列に少数のenum値を含むデータを格納するのに適しており、これらのenum値に基づいて頻繁にクエリやデータの管理を行います。例えば、地理的な位置、州、カテゴリなどを表す列です。列の各値は独立したカテゴリを表します。enum値に基づいてデータをパーティション分割することにより、クエリのパフォーマンスを向上させ、データの管理を容易にすることができます。
リストパーティショニングは、パーティションごとの複数のパーティショニン グ列値を含める必要があるシナリオに特に有用です。例えば、個人が出身地の都市を表すCity
列を含むテーブルがあり、州と都市に基づいてデータを頻繁にクエリや管理する場合です。テーブル作成時に、City
列をリストパーティショニングのパーティショニング列として使用し、同じ州内のさまざまな都市のデータを1つのパーティションに配置するように指定できます。例えばPARTITION pCalifornia VALUES IN ("Los Angeles", "San Francisco", "San Diego")
。この方法により、州と都市に基づいたクエリのパフォーマンスが向上し、データの管理が容易になります。
パーティション内のデータのパーティショニング列値が同じである場合は、式パーティショニングを使用することをお勧めします。
リストパーティショニングと式パーティショニングの比較
リストパーティショニングと式パーティショニング(推奨)の主な違いは、リストパーティショニングでは1つずつパーティションを手動で作成する必要がある点です。一方、式パーティショニングではデータのローディング時にパーティションを自動的に作成し、パーティショニングを簡素化することができます。また、大部分の場合、式パーティショニングはリストパーティショニングを置き換えることができます。具体的な比較は以下の表に示されています:
パーティショニング方法 | リストパーティショニング | 式パーティショニング |
---|---|---|
構文 |
|
|
パーティショニング列ごとのパーティションに複数の値を含むか | サポートされています。1つのパーティションには、パーティションごとのパーティショニング列に異なる値を持つデータを格納できます。以下の例では、ロードされたデータが | サポートされていません。パーティションは、パーティショニング列に同じ値を持つデータを格納します。例えば、 |
データローディング前にパーティションを作成する | サポートされています。テーブル作成時にパーティションを作成する必要があります。 | 必要ありません。データローディング中にパーティションを自動的に作成できます。 |
データローディング時に自動的にリストパーティションを作成するか | サポートされていません。データローディング中にデータに対応するパーティションが存在しない場合はエラーが返されます。 | サポートされています。データローディング中にデータに対応するパーティションが存在しない場合、StarRocksは自動的にパーティションを作成し、データを格納します。各パーティションはパーティショニング列の値が同じであるデータのみを格納できます。 |
SHOW CREATE TABLE | CREATE TABLEステートメントでのパーティション定義を返します。 | データがロードされた後、ステートメントはテーブル作成時に使用されたパーティション句を返します。つまり、 |
使用方法
構文
PARTITION BY LIST (partition_columns)(
PARTITION <partition_name> VALUES IN (value_list)
[, ...]
)
partition_columns ::=
<column> [,<column> [, ...] ]
value_list ::=
value_item [, value_item [, ...] ]
value_item ::=
{ <value> | ( <value> [, <value>, [, ...] ] ) }
パラメータ
パラメータ | 必須 | 説明 |
---|---|---|
| YES | パーティション化する列の名前。パーティション化列の値は、文字列(BINARYはサポートされない)、日付または日時、整数、およびブール値を使用できます。パーティション化列は |
| YES | パーティション名。ビジネスシナリオに基づいて適切なパーティション名を設定することをお勧めします。 |
| YES | パーティションの値リスト。 |
使用例
例1:データセンターの請求詳細を州または都市に基づいて頻繁にクエリするとします。テーブル作成時に、パーティショニング列をcity
と指定し、同じ州内の都市のデータを各パーティションに格納するよう指定できます。これにより、特定の州または都市のクエリのパフォーマンスが向上し、データの管理が容易になります。
CREATE TABLE t_recharge_detail1 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
)
DUPLICATE KEY(id)
PARTITION BY LIST (city) (
PARTITION pLos_Angeles VALUES IN ("Los Angeles"),
PARTITION pSan_Francisco VALUES IN ("San Francisco")
)
DISTRIBUTED BY HASH(`id`);
例2:データセンターの請求詳細を時間範囲と特定の州または都市に基づいて頻繁にクエリするとします。テーブル作成時に、パーティショニング列をdt
とcity
と指定することで、特定の日付と特定の州または都市のデータが同じパーティションに格納され、クエリのスピードが向上し、データの管理が容易になります。
CREATE TABLE t_recharge_detail4 (
id bigint,
user_id bigint,
recharge_money decimal(32,2),
city varchar(20) not null,
dt varchar(20) not null
) ENGINE=OLAP
DUPLICATE KEY(id)
PARTITION BY LIST (dt,city) (
PARTITION p202204_California VALUES IN (
("2022-04-01", "Los Angeles"),
("2022-04-01", "San Francisco"),
("2022-04-02", "Los Angeles"),
("2022-04-02", "San Francisco")
),
PARTITION p202204_Texas VALUES IN (
("2022-04-01", "Houston"),
("2022-04-01", "Dallas"),
("2022-04-02", "Houston"),
("2022-04-02", "Dallas")
)
)
DISTRIBUTED BY HASH(`id`);
制限事項
- リストパーティショニングは、動的パーティショニングや一度に複数のパーティションの作成をサポートしていません。
- 現在、StarRocksの共有データモードはこの機能をサポートしていません。
ALTER TABLE <table_name> DROP PARTITION <partition_name>;
ステートメントを使用してリストパーティショニングで作成されたパーティションを削除する場合、パーティション内のデータが直接削除され、復元することはできません。- 現在、リストパーティショニングで作成されたパーティションをバックアップとリストアすることはできません。
- 現在、StarRocksは、リストパーティショニングを使用して作成されたベーステーブルで非同期マテリアライズドビューを作成することはサポートしていません。