LIST パーティション分割は、明示的な値リストに基づいて行をパーティションに割り当てます。各パーティションには、パーティションキーの値が定義済みの VALUES IN リストに含まれる行が格納されます。DEFAULT パーティションが存在しない場合、どのパーティションにも対応しないキー値を持つ行を挿入するとエラーが返されます。一致しないすべての行をキャプチャするには、DEFAULT パーティションを追加してください。
LIST パーティション分割と LIST COLUMNS パーティション分割の比較については、「概要」トピック内の「LIST パーティション分割と LIST COLUMNS パーティション分割の比較」表をご参照ください。
LIST パーティション分割の適用範囲
LIST パーティション分割は、パーティションキーの値が有限かつ既知のセットに属する場合(例:リージョンコード、カテゴリ ID、ステータスフラグなど)に適しています。個別の値のセットが継続的に増加する可能性がある場合は、HASH パーティション分割を検討してください。新しい値ごとに新しいパーティションを追加するのは、すぐに非現実的になるためです。
構文
CREATE TABLE ...
PARTITION BY LIST(partition_expr) [PARTITIONS number]
(
PARTITION part_name VALUES IN (list_bound_value_set),
PARTITION part_name VALUES IN (list_bound_value_set),
...
)
partition_expr:
partition_column
| partition_func(partition_column)
list_bound_value_set:
list_bound_value[, list_bound_value, ...]
-- サポートされているパーティション分割関数
partition_func:
TO_DAYS
| TO_MONTHS
| TO_WEEKS
| TO_SECOND
| UNIX_TIMESTAMP
| MONTH
| DAYOFWEEK
| DAYOFMONTH
| DAYOFYEAR
| SUBSTR
| SUBSTRING
| RIGHT
| LEFT主な構文要素:
| 要素 | 説明 |
|---|---|
partition_expr | 列名、または列に適用されるサポートされているパーティション分割関数 |
list_bound_value_set | このパーティションに対応する 1 つ以上のカンマ区切りの値 |
DEFAULT | 一致しないすべての行をこのパーティションにルートするキャッチオール値 |
制限事項
| 制限 | デフォルト値 |
|---|---|
| テーブルあたりの最大パーティション数 | 8,192 |
| パーティションキー内の最大列数 | 5 |
| パーティション名の最大長 | 16 文字 |
その他の制約:
パーティション分割関数は単一列のパーティションキーに対してサポートされています。サポートされるデータの型は使用する関数によって異なります。
パーティション分割関数はベクターパーティションキー(複合パーティションキー)ではサポートされていません。
入れ子になったパーティション分割関数はサポートされていません。
パーティション名はテーブル内で一意である必要があります。
パーティションキー列が
TIMESTAMPのようなタイムゾーンに依存するデータの型を使用している場合は、UNIX_TIMESTAMPパーティション分割関数を使用してください。
サポートされているデータの型
以下のデータの型がパーティションキー列の型としてサポートされています:
| カテゴリ | データの型 |
|---|---|
| 整数 | BIGINT、BIGINT UNSIGNED、INT、INT UNSIGNED、MEDIUMINT、MEDIUMINT UNSIGNED、SMALLINT、SMALLINT UNSIGNED、TINYINT、TINYINT UNSIGNED |
| 日付および時刻 | DATETIME、DATE、TIMESTAMP |
| 文字列 | CHAR、VARCHAR |
例
パーティション分割関数を使用した単一列パーティションキー
次の例では、DATETIME 型の birthday 列をパーティションキーとして使用しています。TO_DAYS 関数により日付値が日数に変換され、特定の日付に基づいて行がパーティションに割り当てられます。pm パーティションは DEFAULT を使用して、p1、p2、または p3 にリストされていない日付を持つすべての行をキャプチャします。pm パーティションが存在しない場合、このような行を挿入するとエラーが返されます。
CREATE TABLE tb_l_fn(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY LIST(TO_DAYS(birthday))
(
PARTITION p1 VALUES IN (TO_DAYS('2020-01-01'), TO_DAYS('2020-02-01')),
PARTITION p2 VALUES IN (TO_DAYS('2021-01-01'), TO_DAYS('2021-02-01')),
PARTITION p3 VALUES IN (TO_DAYS('2022-01-01')),
PARTITION pm VALUES IN (DEFAULT)
)その他のサポートされているパーティション分割関数については、「パーティション分割関数」をご参照ください。
パーティション分割関数を使用しない単一列パーティションキー
次の例では、id 列をパーティションキーとして使用し、特定の ID 値を 3 つの名前付きパーティションに割り当てています。どのパーティションにもリストされていない ID を持つ行は、デフォルトパーティション pm に送られます。
CREATE TABLE tb_l(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY LIST(id)
(
PARTITION p1 VALUES IN (1000, 1001, 1002),
PARTITION p2 VALUES IN (2000, 2001, 2002),
PARTITION p3 VALUES IN (3000),
PARTITION pm VALUES IN (DEFAULT)
)ベクターパーティションキー(複合列)
PARTITION BY LIST で複数の列をパーティションキーとして使用する場合、PolarDB for Xscale は自動的にその文を LIST COLUMNS パーティション分割に変換します。
次の例では、birthday および id を 2 列のパーティションキーとして使用しています:
-- ベクターパーティションキーを使用した LIST による元の文
CREATE TABLE tb_l(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY LIST(birthday, id)
(
PARTITION p1 VALUES IN (('1990-04-03', 1000), ('1991-04-03', 2000)),
PARTITION p2 VALUES IN (('2000-01-03', 3000), ('2001-04-03', 3001)),
PARTITION pm VALUES IN (DEFAULT)
)PolarDB for Xscale は上記の文を、同等の LIST COLUMNS 定義に変換します:
-- 自動変換後の同等の LIST COLUMNS パーティション分割
CREATE TABLE tb_l(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY LIST COLUMNS(birthday, id)
(
PARTITION p1 VALUES IN (('1990-04-03', 1000), ('1991-04-03', 2000)),
PARTITION p2 VALUES IN (('2000-01-03', 3000), ('2001-04-03', 3001)),
PARTITION pm VALUES IN (DEFAULT)
)次のステップ
パーティション分割関数 — サポートされている関数とその適用可能なデータの型
パーティションテーブルの種類とポリシー — LIST、LIST COLUMNS、RANGE、HASH パーティション分割の比較