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

Expression partitioning (recommended)

式に基づくパーティショニング(推奨)

v3.0から、StarRocksは式に基づくパーティショニング(以前の自動パーティショニングとしても知られる)をサポートしており、より柔軟で使いやすくなりました。このパーティショニング方法は、連続した時間範囲や列挙値に基づいたデータのクエリと管理など、ほとんどのシナリオに適しています。

テーブル作成時には、単純なパーティション式(時間関数式または列式のいずれか)を指定するだけでよいです。データのロード中、StarRocksはデータとパーティション式で定義されたルールに基づいて、自動的にパーティションを作成します。テーブル作成時に膨大な数のパーティションを手動で作成する必要はなく、また、動的なパーティションプロパティを設定する必要もありません。

時間関数式に基づくパーティショニング

連続した時間範囲に基づいて頻繁にデータをクエリや管理する場合、パーティション列としてDATE型またはDATETIME型のカラムを指定し、時間関数式で年、月、日、または時をパーティションの粒度として指定するだけでよいです。StarRocksは、データとパーティション式に基づいて、パーティションを自動的に作成し、パーティションの開始日時と終了日時またはDATETIMEを設定します。

ただし、月ごとに過去のデータをパーティションに分割し、直近のデータを日ごとにパーティションに分割するなど、特殊なシナリオでは、範囲パーティショニングを使用してパーティションを作成する必要があります。

構文

PARTITION BY expression
...
[ PROPERTIES( 'partition_live_number' = 'xxx' ) ]

expression ::=
{ date_trunc ( <time_unit> , <partition_column> ) |
time_slice ( <partition_column> , INTERVAL <N> <time_unit> [ , boundary ] ) }

パラメータ

パラメータ

必須

説明

expression

YES

現在は、date_trunc関数とtime_slice関数のみがサポートされています。time_slice関数を使用する場合は、boundaryパラメータを渡す必要はありません。なぜなら、このシナリオでは、このパラメータのデフォルト値は「floor」ですが、「ceil」にはなりません。

time_unit

YES

パーティションの粒度です。hourdaymonth、またはyearが指定できます。weekのパーティションの粒度はサポートされていません。パーティションの粒度がhourの場合、パーティションのカラムはDATETIMEデータ型でなければなりません。

partition_column

YES

パーティションカラムの名前。

  • パーティションカラムはDATEまたはDATETIMEデータ型である必要があります。パーティションカラムはNULL値を許容します。
  • date_trunc関数を使用する場合、パーティションカラムはDATEまたはDATETIMEデータ型にできます。time_slice関数を使用する場合、パーティションカラムは必ずDATETIMEデータ型でなければなりません。
  • パーティションカラムがDATEデータ型の場合、サポートされる範囲は[0000-01-01 〜 9999-12-31]です。パーティションカラムがDATETIMEデータ型の場合、サポートされる範囲は[0000-01-01 01:01:01 〜 9999-12-31 23:59:59]です。
  • 現在、パーティションカラムは1つのみ指定でき、複数のパーティションカラムはサポートされていません。

partition_live_number

NO

保持する最新のパーティションの数です。「最新」とは、現在の日付を基準にして、遡った日数を数えるという意味です。その他のパーティション(はるかに古いパーティション)は削除されます。StarRocksはタスクをスケジュールしてパーティションの数を管理し、スケジュールの間隔はFEの動的パラメータdynamic_partition_check_interval_secondsを介して設定できます。デフォルト値は600秒(10分)です。現在の日付が2023年4月4日で、partition_live_number2に設定されており、パーティションにはp20230401p20230402p20230403p20230404が含まれているとします。パーティションp20230403p20230404が保持され、他のパーティション(はるかに早く作成されたパーティション)は削除されます。データレイクに将来の日付(4月5日と4月6日)からロードされるような不正なデータがロードされた場合、パーティションにはp20230401p20230402p20230403p20230404、およびp20230404が含まれ、p20230404が保持され、その他のパーティションは削除されます。

使用上の注意

  • StarRocksはデータのロード中に、ロードされたデータに基づいて一部のパーティションを自動的に作成しますが、ロードジョブが何らかの理由で失敗した場合、StarRocksによって自動的に作成されたパーティションは自動的に削除されません。
  • StarRocksは、自動的に作成されるパーティションの最大数をデフォルトで4096に設定しており、これはFEパラメータmax_automatic_partition_numberで構成できます。このパラメータを使用することで、誤って多数のパーティションを作成することを防ぐことができます。
  • パーティションの命名規則は、動的パーティショニングの命名規則と一致します。

例1:日単位でデータを頻繁にクエリする場合、date_trunc()パーティション式を使用し、テーブル作成時にパーティション列をevent_day、パーティションの粒度をdayと指定します。データはロード中に日付に基づいて自動的にパーティションに分割されます。同じ日のデータは1つのパーティションに格納され、パーティションプルーニングを使用してクエリの効率を大幅に向上させることができます。

CREATE TABLE site_access1 (
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY date_trunc('day', event_day)
DISTRIBUTED BY HASH(event_day, site_id);

例えば、以下の2つのデータ行をロードすると、StarRocksはデータに基づいてp20230226p20230227の2つのパーティションを自動的に作成し、範囲[2023-02-26 00:00:00、2023-02-27 00:00:00)と[2023-02-27 00:00:00、2023-02-28 00:00:00)を設定します。以降、これらの範囲内のデータは自動的に該当するパーティションにルーティングされます。

-- 2つのデータ行を挿入
INSERT INTO site_access1
VALUES ("2023-02-26 20:12:04",002,"ニューヨーク","サム・スミス",1),
("2023-02-27 21:06:54",001,"ロサンゼルス","テイラー・スウィフト",1);

-- パーティションを表示
mysql > SHOW PARTITIONS FROM site_access1;
+-------------+---------------+----------------+---------------------+--------------------+--------+--------------+------------------------------------------------------------------------------------------------------+--------------------+---------+----------------+---------------------+--------------------------+----------+------------+----------+
| PartitionId | PartitionName | VisibleVersion | VisibleVersionTime | VisibleVersionHash | State | PartitionKey | Range | DistributionKey | Buckets | ReplicationNum | StorageMedium | CooldownTime | LastConsistencyCheckTime | DataSize | IsInMemory | RowCount |
+-------------+---------------+----------------+---------------------+--------------------+--------+--------------+------------------------------------------------------------------------------------------------------+--------------------+---------+----------------+---------------------+--------------------------+----------+------------+----------+
| 17138 | p20230226 | 2 | 2023-07-19 17:53:59 | 0 | NORMAL | event_day | [types: [DATETIME]; keys: [2023-02-26 00:00:00]; ..types: [DATETIME]; keys: [2023-02-27 00:00:00]; ) | event_day, site_id | 6 | 3 | HDD | 9999-12-31 23:59:59 | NULL | 0B | false | 0 |
| 17113 | p20230227 | 2 | 2023-07-19 17:53:59 | 0 | NORMAL | event_day | [types: [DATETIME]; keys: [2023-02-27 00:00:00]; ..types: [DATETIME]; keys: [2023-02-28 00:00:00]; ) | event_day, site_id | 6 | 3 | HDD | 9999-12-31 23:59:59 | NULL | 0B | false | 0 |
+-------------+---------------+----------------+---------------------+--------------------+--------+--------------+------------------------------------------------------------------------------------------------------+--------------------+---------+----------------+---------------------+--------------------------+----------+------------+----------+
2in set (0.00 sec)

例2:パーティションのライフサイクル管理を実装するために、最新の3つのパーティションのみを保持し、過去のパーティションを削除する場合、partition_live_numberプロパティを使用して保持するパーティションの数を指定することができます。

CREATE TABLE site_access2 (
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY date_trunc('month', event_day)
DISTRIBUTED BY HASH(event_day, site_id)
PROPERTIES(
"partition_live_number" = "3" -- 最新の3つのパーティションのみを保持
);

例3:週単位でデータを頻繁にクエリする場合、time_slice()パーティション式を使用し、テーブル作成時にパーティション列をevent_day、パーティションの粒度を7日と指定します。1週間分のデータは1つのパーティションに格納され、パーティションプルーニングを使用してクエリの効率を大幅に向上させることができます。

CREATE TABLE site_access(
event_day DATETIME NOT NULL,
site_id INT DEFAULT '10',
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT '',
pv BIGINT DEFAULT '0'
)
DUPLICATE KEY(event_day, site_id, city_code, user_name)
PARTITION BY time_slice(event_day, INTERVAL 7 day)
DISTRIBUTED BY HASH(event_day, site_id)

列式に基づくパーティショニング(v3.1以降)

特定のタイプのデータを頻繁にクエリや管理する場合、パーティションカラムとして表される列のみを指定すればよいです。StarRocksは、ロードされたデータのパーティションカラムの値に基づいて自動的にパーティションを作成します。

ただし、テーブルにcityという列が含まれ、国と都市に基づいてデータを頻繁にクエリや管理する場合など、特殊なシナリオでは、リストパーティショニングを使用して、同じ国内の複数の都市のデータを1つのパーティションに格納する必要があります。

構文

PARTITION BY expression
...
[ PROPERTIES("partition_live_number" = "xxx") ]

expression ::=
( partition_columns )

partition_columns ::=
<column>, [ <column> [,...] ]

パラメータ

パラメータ

必須

説明

partition_columns

YES

パーティションカラムの名前。

  • パーティションカラムの値は、文字列(BINARYはサポートされていません)、日付または日時、整数、真偽値です。パーティションカラムはNULL値を許容します。
  • 各パーティションは、パーティションカラムの値が同じ値であるデータのみを含むことができます。パーティションカラムの異なる値を含むデータを同一のパーティションに含めるには、リストパーティションを参照してください。

partition_live_number

No

保持するパーティションの数です。パーティションカラムの値をパーティション間で比較し、小さい値を持つパーティションを定期的に削除しながら、大きい値を持つパーティションを保持します。

StarRocksはタスクをスケジュールしてパーティションの数を管理し、スケジュールの間隔はFEの動的パラメータdynamic_partition_check_interval_secondsで設定できます。デフォルト値は600秒(10分)です。

パーティションカラムの値が文字列の場合、StarRocksはパーティション名の辞書順を比較し、先に来るパーティションを定期的に保持し、後に来るパーティションを削除します。

使用上の注意

  • データのロード中、StarRocksはデータとパーティション式に基づいて一部のパーティションを自動的に作成しますが、ロードジョブが何らかの理由で失敗した場合、StarRocksによって自動的に作成されたパーティションは自動的に削除されません。
  • StarRocksは、自動的に作成されるパーティションの最大数をデフォルトで4096に設定しており、これはFEパラメータmax_automatic_partition_numberで構成できます。このパラメータを使用することで、誤って多数のパーティションを作成することを防ぐことができます。
  • パーティションの命名規則: 複数のパーティションカラムが指定されている場合、異なるパーティションカラムの値はパーティション名でアンダースコア _ で結ばれ、その形式は p<パーティションカラム1の値>_<パーティションカラム2の値>_...です。例えば、パーティションカラムとして dtprovince の2つの列が指定されており、どちらも文字列型で、値が 2022-04-01beijing のデータ行がロードされた場合、自動的に作成されるパーティションの名前は p20220401_beijing となります。

例1:データセンターの請求の詳細を時間範囲と特定の都市別で頻繁にクエリする場合、テーブル作成時にパーティション式を使用して最初のパーティションカラムとして dtcity を指定します。これにより、同じ日付と都市に属しているデータは同じパーティションにルーティングされ、パーティションプルーニングを使用してクエリの効率を大幅に向上させることができます。

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 (dt,city)
DISTRIBUTED BY HASH(`id`);

テーブルに単一のデータ行を挿入します。

INSERT INTO t_recharge_detail1 
VALUES (1, 1, 1, 'Houston', '2022-04-01');

パーティションを表示します。結果には、ロードされたデータに基づいてStarRocksが自動的に作成したパーティションp20220401_Houstonが表示されます。以降、dt 列の値が 2022-04-01 または city 列の値が Houston のデータはこのパーティションに自動的に格納されます。

各パーティションは、指定されたパーティションカラムの同じ値を持つデータのみを含むことができます。パーティションカラムに異なる値を持つデータを同じパーティションに含めるには、リストパーティションを参照してください。

MySQL > SHOW PARTITIONS from t_recharge_detail1\G
*************************** 1. row ***************************
PartitionId: 16890
PartitionName: p20220401_Houston
VisibleVersion: 2
VisibleVersionTime: 2023-07-19 17:24:53
VisibleVersionHash: 0
State: NORMAL
PartitionKey: dt, city
List: (('2022-04-01', 'Houston'))
DistributionKey: id
Buckets: 6
ReplicationNum: 3
StorageMedium: HDD
CooldownTime: 9999-12-31 23:59:59
LastConsistencyCheckTime: NULL
DataSize: 2.5KB
IsInMemory: false
RowCount: 1
1in set (0.00 sec)

例2:パーティションのライフサイクル管理を実装するために、テーブル作成時にpartition_live_numberプロパティを使用して保持するパーティションの数を指定する場合、以下のようになります。

CREATE TABLE t_recharge_detail2 (
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 (dt,city)
DISTRIBUTED BY HASH(`id`)
PROPERTIES(
"partition_live_number" = "3" -- 最新の3つのパーティションのみを保持
);

パーティションの管理

パーティションにデータをロードする

データのロード中、StarRocksはロードされたデータとパーティション式で定義したパーティションルールに基づいて自動的にパーティションを作成します。

ただし、テーブル作成時に式パーティショニングを使用し、特定のパーティションにデータを上書きするためにINSERT OVERWRITEを使用する場合、パーティションが作成されているかどうかにかかわらず、現在はPARTITION()内で明示的にパーティションの範囲を指定する必要があります。これは、範囲パーティショニングリストパーティショニングとは異なり、PARTITION (<partition_name>)のみを指定することができます。

時間関数式を使用してテーブルを作成し、特定のパーティションにデータを上書きする場合、そのパーティションの開始日付または日時(テーブル作成時に設定されたパーティションの粒度)を指定する必要があります。パーティションが存在しない場合、データのロード中に自動的に作成されることがあります。

INSERT OVERWRITE site_access1 PARTITION(event_day='2022-06-08 20:12:04')
SELECT * FROM site_access2 PARTITION(p20220608);

列式を使用してテーブルを作成し、特定のパーティションにデータを上書きする場合、そのパーティションに含まれるパーティションカラムの値を指定する必要があります。パーティションが存在しない場合、データのロード中に自動的に作成されることがあります。

INSERT OVERWRITE t_recharge_detail1 PARTITION(dt='2022-04-02',city='texas')
SELECT * FROM t_recharge_detail2 PARTITION(p20220402_texas);

パーティションを表示する

特定の自動的に作成されたパーティションに関する情報を表示する場合、SHOW PARTITIONS FROM <table_name>ステートメントを使用する必要があります。SHOW CREATE TABLE <table_name>ステートメントでは、テーブル作成時に設定された式パーティショニングの構文のみが返されます。

MySQL > SHOW PARTITIONS FROM t_recharge_detail1;
+-------------+-------------------+----------------+---------------------+--------------------+--------+--------------+-----------------------------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+----------+
| PartitionId | PartitionName | VisibleVersion | VisibleVersionTime | VisibleVersionHash | State | PartitionKey | List | DistributionKey | Buckets | ReplicationNum | StorageMedium | CooldownTime | LastConsistencyCheckTime | DataSize | IsInMemory | RowCount |
+-------------+-------------------+----------------+---------------------+--------------------+--------+--------------+-----------------------------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+----------+
| 16890 | p20220401_Houston | 2 | 2023-07-19 17:24:53 | 0 | NORMAL | dt, city | (('2022-04-01', 'Houston')) | id | 6 | 3 | HDD | 9999-12-31 23:59:59 | NULL | 2.5KB | false | 1 |
| 17056 | p20220402_texas | 2 | 2023-07-19 17:27:42 | 0 | NORMAL | dt, city | (('2022-04-02', 'texas')) | id | 6 | 3 | HDD | 9999-12-31 23:59:59 | NULL | 2.5KB | false | 1 |
+-------------+-------------------+----------------+---------------------+--------------------+--------+--------------+-----------------------------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+----------+
2in set (0.00 sec)

制限事項

  • v3.1以降、StarRocksの共有データモードは、時間関数式をサポートし、列式はサポートしません。
  • 現在、式パーティショニングが構成されたテーブルを使用してCTASを使用してテーブルを作成することはサポートされていません。
  • 現在、Spark Loadを使用して式パーティショニングを使用しているテーブルにデータをロードすることはサポートされていません。
  • ALTER TABLE <table_name> DROP PARTITION <partition_name>ステートメントを使用して、列式によって作成されたパーティションを削除することはできますが、パーティション内のデータは直接削除され、復元することはできません。
  • 式パーティショニングによって作成されたパーティションをバックアップとリストアすることはできません。