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 ] ) }
パラメータ
パラメータ  | 必須  | 説明  | 
|---|---|---|
  | YES  | 現在は、  | 
  | YES  | パーティションの粒度です。  | 
  | YES  | パーティションカラムの名前。 
  | 
  | NO  | 保持する最新のパーティションの数です。「最新」とは、現在の日付を基準にして、遡った日数を数えるという意味です。その他のパーティション(はるかに古いパーティション)は削除されます。StarRocksはタスクをスケジュールしてパーティションの数を管理し、スケジュールの間隔はFEの動的パラメータ  | 
使用上の注意
- 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はデータに基づいてp20230226とp20230227の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        |
+-------------+---------------+----------------+---------------------+--------------------+--------+--------------+------------------------------------------------------------------------------------------------------+--------------------+---------+----------------+---------------------+--------------------------+----------+------------+----------+
2 行 in 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> [,...] ]
パラメータ
パラメータ  | 必須  | 説明  | 
|---|---|---|
  | YES  | パーティションカラムの名前。 
  | 
  | No  | 保持するパーティションの数です。パーティションカラムの値をパーティション間で比較し、小さい値を持つパーティションを定期的に削除しながら、大きい値を持つパーティションを保持します。 StarRocksはタスクをスケジュールしてパーティションの数を管理し、スケジュールの間隔はFEの動的パラメータ 注 パーティションカラムの値が文字列の場合、StarRocksはパーティション名の辞書順を比較し、先に来るパーティションを定期的に保持し、後に来るパーティションを削除します。  | 
使用上の注意
- データのロード中、StarRocksはデータとパーティション式に基づいて一部のパーティションを自動的に作成しますが、ロードジョブが何らかの理由で失敗した場合、StarRocksによって自動的に作成されたパーティションは自動的に削除されません。
 - StarRocksは、自動的に作成されるパーティションの最大数をデフォルトで4096に設定しており、これはFEパラメータ
max_automatic_partition_numberで構成できます。このパラメータを使用することで、誤って多数のパーティションを作成することを防ぐことができます。 - パーティションの命名規則: 複数のパーティションカラムが指定されている場合、異なるパーティションカラムの値はパーティション名でアンダースコア 
_で結ばれ、その形式はp<パーティションカラム1の値>_<パーティションカラム2の値>_...です。例えば、パーティションカラムとしてdtとprovinceの2つの列が指定されており、どちらも文字列型で、値が2022-04-01とbeijingのデータ行がロードされた場合、自動的に作成されるパーティションの名前はp20220401_beijingとなります。 
例
例1:データセンターの請求の詳細を時間範囲と特定の都市別で頻繁にクエリする場合、テーブル作成時にパーティション式を使用して最初のパーティションカラムとして dt と 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 (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
1 行 in 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        |
+-------------+-------------------+----------------+---------------------+--------------------+--------+--------------+-----------------------------+-----------------+---------+----------------+---------------+---------------------+--------------------------+----------+------------+----------+
2 行 in set (0.00 sec)