式に基づくパーティション化(推奨)
v3.0以降、StarRocksは式に基づくパーティション化(以前は自動パーティション化として知られていました)をサポートしており、より柔軟でユーザーフレンドリーです。このパーティション化の手法は、連続した時間範囲やENUM値に基づいてデータをクエリおよび管理するほとんどのシナリオに適しています。
テーブル作成時に単純なパーティション式(時間関数式またはカラム式のいずれか)を指定するだけで済みます。データロード中に、StarRocksはデータとパーティション式で定義されたルールに基づいて自動的にパーティションを作成します。テーブル作成時に多数のパーティションを手動で作成する必要はなく、動的パーティションプロパティを設定する必要もありません。
時間関数式に基づくパーティション化
連続した時間範囲に基づいてデータを頻繁にクエリおよび管理する場合、パーティションカラムとして日付型(DATEまたはDATETIME)のカラムを指定し、時間関数式で年、月、日、または時間をパーティショングラニュラリティとして指定するだけで済みます。StarRocksはロードされたデータとパーティション式に基づいて自動的にパーティションを作成し、パーティションの開始日と終了日または日時を設定します。
ただし、月ごとに履歴データをパーティション化し、最近のデータを日ごとにパーティション化するなどの特殊なシナリオでは、レンジパーティション化を使用してパーティションを作成する必要があります。
構文
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
説明: パーティショングラニュラリティであり、hour
、day
、month
、または year
です。week
パーティショングラニュラリティはサポートされていません。パーティショングラニュラリティが hour
の場合、パーティションカラムは DATETIME データ型でなければならず、DATE データ型ではできません。
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
説明: 最新のパーティションの数を保持します。パーティションは現在の日付を基準にして時系列順に並べられ、現在の日付から partition_live_number
を引いた日付より古いパーティションは削除されます。StarRocksはパーティションの数を管理するタスクをスケジュールし、スケジューリング間隔はFE動的パラメータ dynamic_partition_check_interval_seconds
を通じて設定でき、デフォルトは600秒(10分)です。例えば、現在の日付が2023年4月4日で、partition_live_number
が 2
に設定されており、パーティションが p20230401
、p20230402
、p20230403
、p20230404
を含む場合、パーティション p20230403
と p20230404
が保持され、他のパーティションは削除されます。将来の日付である4月5日と4月6日のデータがロードされた場合、パーティションは p20230401
、p20230402
、p20230403
、p20230404
、p20230405
、p20230406
を含みます。その場合、パーティション p20230403
、p20230404
、p20230405
、p20230406
が保持され、他のパーティションは削除されます。
使用上の注意
- データロード中に、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は自動的に2つのパーティション p20230226
と p20230227
を作成し、それぞれの範囲は [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,"New York","Sam Smith",1),
("2023-02-27 21:06:54",001,"Los Angeles","Taylor Swift",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 |
+-------------+---------------+----------------+---------------------+--------------------+--------+--------------+------------------------------------------------------------------------------------------------------+--------------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+----------+
2 rows in set (0.00 sec)
例2: パーティションのライフサイクル管理を実装し、最新のパーティションのみを保持し、履歴パーティションを削除したい場合、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)