PolarDB for MySQL は RANGE-RANGE コンポジット・パーティションをサポートしており、トップレベルのパーティションおよび各サブパーティションの両方がパーティション戦略として RANGE または RANGE COLUMNS を使用します。各行はまずパーティションキー値に基づいてパーティションに割り当てられ、次にそのパーティション内でサブパーティションキー値に基づいてサブパーティションに割り当てられます。
構文
CREATE TABLE ... PARTITION BY RANGE {(expr) | COLUMNS(column_list)}
SUBPARTITION BY RANGE(expr)
[(partition_definition [, partition_definition] ...)];partition_definition:
PARTITION partition_name
VALUES LESS THAN {(value | value_list) | MAXVALUE}
[(subpartition_definition [, subpartition_definition] ...)]subpartition_definition:
SUBPARTITION subpartition_name
VALUES LESS THAN {value | MAXVALUE}パラメーター
| パラメーター | 説明 |
|---|---|
expr | パーティション式です。INT 型である必要があります。文字列型はサポートされていません。 |
column_list | RANGE COLUMNS() で使用するパーティションキー列のリストです。式はサポートされていません。 |
value | パーティションの境界値です。 |
value_list | RANGE COLUMNS() で使用するパーティションキー列の値リストです。 |
MAXVALUE | パーティションの最大値です。 |
partition_name | パーティションの名前です。テーブル内で一意である必要があります。 |
subpartition_name | サブパーティションの名前です。テーブル内で一意である必要があります。 |
例
RANGE-RANGE パーティションテーブル
トップレベルで dept_no でパーティションし、各パーティション内で part_no でサブパーティションします。
CREATE TABLE sales_range_range
(
dept_no INT,
part_no INT,
country varchar(20),
date DATE,
amount INT
)
PARTITION BY RANGE(dept_no)
SUBPARTITION BY RANGE(part_no)
(
PARTITION p0 VALUES LESS THAN (1000) (
SUBPARTITION s0 VALUES LESS THAN(100),
SUBPARTITION s1 VALUES LESS THAN(200),
SUBPARTITION s2 VALUES LESS THAN(300),
SUBPARTITION s3 VALUES LESS THAN(MAXVALUE)
),
PARTITION p1 VALUES LESS THAN (2000)
(
SUBPARTITION s4 VALUES LESS THAN(100),
SUBPARTITION s5 VALUES LESS THAN(200),
SUBPARTITION s6 VALUES LESS THAN(300),
SUBPARTITION s7 VALUES LESS THAN(MAXVALUE)
),
PARTITION p2 VALUES LESS THAN (MAXVALUE)
(
SUBPARTITION s8 VALUES LESS THAN(100),
SUBPARTITION s9 VALUES LESS THAN(200),
SUBPARTITION s10 VALUES LESS THAN(300),
SUBPARTITION s11 VALUES LESS THAN(MAXVALUE)
)
);dept_no = 500 かつ part_no = 150 の行は、パーティション p0(500 < 1000 のため)に割り当てられ、その後サブパーティション s1(150 が 100~200 の範囲に入るため)に割り当てられます。
RANGE COLUMNS-RANGE パーティションテーブル
RANGE COLUMNS を使用して複合キー (dept_no, part_no) でパーティションし、amount でサブパーティションします。
CREATE TABLE sales_range_columns_range
(
dept_no INT,
part_no INT,
country varchar(20),
date DATE,
amount INT
)
PARTITION BY RANGE COLUMNS(dept_no, part_no)
SUBPARTITION BY RANGE(amount)
(
PARTITION p1 VALUES LESS THAN(1000, MAXVALUE)(
SUBPARTITION s0 VALUES LESS THAN(100),
SUBPARTITION s1 VALUES LESS THAN(200),
SUBPARTITION s2 VALUES LESS THAN(300),
SUBPARTITION s3 VALUES LESS THAN(MAXVALUE)
),
PARTITION p2 VALUES LESS THAN(2000, MAXVALUE)(
SUBPARTITION s4 VALUES LESS THAN(100),
SUBPARTITION s5 VALUES LESS THAN(200),
SUBPARTITION s6 VALUES LESS THAN(300),
SUBPARTITION s7 VALUES LESS THAN(MAXVALUE)
),
PARTITION p3 VALUES LESS THAN(MAXVALUE, MAXVALUE)(
SUBPARTITION s8 VALUES LESS THAN(100),
SUBPARTITION s9 VALUES LESS THAN(200),
SUBPARTITION s10 VALUES LESS THAN(300),
SUBPARTITION s11 VALUES LESS THAN(MAXVALUE)
)
);注意事項
サブパーティション名は単一のパーティション内だけでなく、テーブル全体で一意である必要があります。
SUBPARTITION BY RANGE(expr)で使用されるexprは INT 値に評価される必要があります。文字列型はサポートされていません。RANGE COLUMNS()は列リストを受け入れますが、式はサポートしていません。