レンジパーティション化 (レガシー)
レンジパーティション化は、時系列データや連続した数値データのような単純で連続したデータを保存するのに適しています。
レンジパーティション化に基づき、動的パーティショニング戦略を使用してパーティションを作成できます。これにより、パーティションの有効期限(TTL)を管理することが可能です。
v3.4以降、式に基づくパーティション化がさらに最適化され、すべてのパーティション化戦略を統一し、より複雑なソリューションをサポートしています。ほとんどの場合に推奨され、将来的にはレンジパーティション化戦略に取って代わる予定です。
概要
レンジパーティション化は、連続した日付/数値範囲に基づいて頻繁にクエリされるデータに適しています。また、過去のデータを月ごとにパーティション化し、最近のデータを日ごとにパーティション化する必要がある特別なケースにも適用できます。
データのパーティション列を明示的に定義し、パーティションとパーティション列値の範囲との間のマッピング関係を確立する必要があります。データロード中に、StarRocksはデータのパーティション列値が属する範囲に基づいてデータを対応するパーティションに割り当てます。
パーティション列のデータ型については、v3.3.0以前は、レンジパーティション化は日付型と整数型のパーティション列のみをサポートしていました。v3.3.0以降、3つの特定の時間関数をパーティション列として使用できます。パーティションとパーティション列値の範囲とのマッピング関係を明示的に定義する際には、まず特定の時間関数を使用してタイムスタンプまたは文字列のパーティション列値を日付値に変換し、次に変換された日付値に基づいてパーティションを分割する必要があります。
- パーティション列の値がタイムスタンプの場合、パーティションを分割する際には from_unixtime または from_unixtime_ms 関数を使用してタイムスタンプを日付値に変換する必要があります。from_unixtime 関数を使用する場合、パーティション列は INT および BIGINT 型のみをサポートします。from_unixtime_ms 関数を使用する場合、パーティション列は BIGINT 型のみを サポートします。
- パーティション列の値が文字列 (STRING, VARCHAR, または CHAR 型) の場合、パーティションを分割する際には str2date 関数を使用して文字列を日付値に変換する必要があります。
使用法
構文
PARTITION BY RANGE ( partition_columns | function_expression ) ( single_range_partition | multi_range_partitions )
partition_columns ::=
<column> [, ...]
function_expression ::=
from_unixtime(column)
| from_unixtime_ms(column)
| str2date(column)
single_range_partition ::=
PARTITION <partition_name> VALUES partition_key_desc
partition_key_desc ::=
LESS THAN { MAXVALUE | value_list }
| value_range
-- value_range は左閉右開区間です。例: `[202201, 202212)`。
-- 半開区間ではブラケット `[` を明示的に指定する必要があります。
value_range ::=
[value_list, value_list)
value_list ::=
( <value> [, ...] )
multi_range_partitions ::=
{ PARTITIONS START ("<start_date_value>") END ("<end_date_value>") EVERY ( INTERVAL <int_value> time_unit )
| PARTITIONS START ("<start_integer_value>") END ("<end_integer_value>") EVERY ( <int_value> ) } -- START および END で指定されたパーティション列値が整数であっても、パーティション列値はダブルクォートで囲む必要があります。ただし、EVERY 句の間隔値はダブルクォートで囲む必要はありません。
time_unit ::=
HOUR | DAY | WEEK | MONTH | YEAR
パラメータ
パラメータ | 説明 |
---|---|
partition_columns | パーティション列の名前。パーティション列の値は文字列 (BINARY はサポートされていません)、日付または日時、または整数であることができます。 |
function_expression | パーティション列を特定のデータ型に変換する関数式。サポートされている関数: from_unixtime, from_unixtime_ms, および str2date。 注意 レンジパーティション化は1つの関数式のみをサポートします。 |
partition_name | パーティション名。ビジネスシナリオに基づいて適切なパーティション名を設定し、異なるパーティション内のデータを区別することをお勧めします。 |
例
-
日付型パーティション列に基づいて値の範囲を手動で定義してパーティションを作成します。
PARTITION BY RANGE(date_col)(
PARTITION p1 VALUES LESS THAN ("2020-01-31"),
PARTITION p2 VALUES LESS THAN ("2020-02-29"),
PARTITION p3 VALUES LESS THAN ("2020-03-31")
) -
整数型パーティション列に基づいて値の範囲を手動で定義してパーティションを作成します。
PARTITION BY RANGE (int_col) (
PARTITION p1 VALUES LESS THAN ("20200131"),
PARTITION p2 VALUES LESS THAN ("20200229"),
PARTITION p3 VALUES LESS THAN ("20200331")
) -
同じ日付間隔で複数のパーティションを作成します。
PARTITION BY RANGE (date_col) (
START ("2021-01-01") END ("2021-01-04") EVERY (INTERVAL 1 DAY)
) -
異なる日付間隔で複数のパーティションを作成します。
PARTITION BY RANGE (date_col) (
START ("2019-01-01") END ("2021-01-01") EVERY (INTERVAL 1 YEAR),
START ("2021-01-01") END ("2021-05-01") EVERY (INTERVAL 1 MONTH),
START ("2021-05-01") END ("2021-05-04") EVERY (INTERVAL 1 DAY)
) -
同じ整数間隔で複数のパーティションを作成します。
PARTITION BY RANGE (int_col) (
START ("1") END ("10") EVERY (1)
) -
異なる整数間隔で複数のパーティションを作成します。
PARTITION BY RANGE (int_col) (
START ("1") END ("10") EVERY (1),
START ("10") END ("100") EVERY (10)
) -
from_unixtime を使用してタイムスタンプ (文字列) 型のパーティション列を日付型に変換します。
PARTITION BY RANGE(from_unixtime(timestamp_col)) (
PARTITION p1 VALUES LESS THAN ("2021-01-01"),
PARTITION p2 VALUES LESS THAN ("2021-01-02"),
PARTITION p3 VALUES LESS THAN ("2021-01-03")
) -
str2date を使用して文字列型のパーティション列を日付型に変換します。
PARTITION BY RANGE(str2date(string_col, '%Y-%m-%d'))(
PARTITION p1 VALUES LESS THAN ("2021-01-01"),
PARTITION p2 VALUES LESS THAN ("2021-01-02"),
PARTITION p3 VALUES LESS THAN ("2021-01-03")
)