HASH-LIST パーティションは、パーティション式をハッシュ化して行を複数のパーティションに分散させた後、離散値のリストに基づいて各行をサブパーティションに配置します。このパーティショニング戦略は、最上位レベル(ハッシュ)で均等なデータ分布を実現し、各パーティション内でカテゴリ別にグループ化する必要がある場合に使用します。
構文
CREATE TABLE [schema.]table_name
table_definition
PARTITION BY [LINEAR] HASH(expr)
SUBPARTITION BY LIST (expr)
(partition_definition [, partition_definition] ...)partition_definition の構文は以下のとおりです。
PARTITION partition_name
(subpartition_definition [, subpartition_definition] ...)subpartition_definition の構文は以下のとおりです。
SUBPARTITION subpartition_name
VALUES IN (value_list)パラメーター
| パラメーター | 説明 |
|---|---|
table_name | テーブル名です。 |
expr | パーティション式です。INT 型である必要があります — 文字列型はサポートされていません。 |
value_list | サブパーティションの境界値のリストです。 |
partition_name | パーティション名です。テーブル内で一意である必要があります。 |
subpartition_name | サブパーティション名です。テーブル内で一意である必要があります。 |
PARTITION BY HASHおよびSUBPARTITION BY LISTの両方の式は、INT 型の値を返す必要があります。いずれの式においても文字列型はサポートされていません。
HASH-LIST パーティションテーブルの作成
次の例では、sales_hash_list テーブルを作成します。dept_no をハッシュキーとしてパーティション化し、part_no をリストキーとしてサブパーティション化しています。このテーブルには 3 つのパーティションがあり、それぞれに値 1~6 をカバーする 3 つのサブパーティションが含まれます。
CREATE TABLE sales_hash_list
(
dept_no INT,
part_no INT,
country VARCHAR(20),
date DATE,
amount INT
)
PARTITION BY HASH(dept_no)
SUBPARTITION BY LIST(part_no)
(
PARTITION dp0 (
SUBPARTITION p0 VALUES IN (1, 2),
SUBPARTITION p1 VALUES IN (3, 4),
SUBPARTITION p2 VALUES IN (5, 6)
),
PARTITION dp1 (
SUBPARTITION p3 VALUES IN (1, 2),
SUBPARTITION p4 VALUES IN (3, 4),
SUBPARTITION p5 VALUES IN (5, 6)
),
PARTITION dp2 (
SUBPARTITION p6 VALUES IN (1, 2),
SUBPARTITION p7 VALUES IN (3, 4),
SUBPARTITION p8 VALUES IN (5, 6)
)
);行のルーティング方法
PolarDB では、各行のターゲットサブパーティションを決定するために、以下の 2 段階の処理を行います。
ハッシュ段階 —
dept_noをハッシュ化し、3 つのパーティションのいずれか(dp0、dp1、またはdp2)を選択します。リスト段階 — 選択されたパーティション内の
part_noを、そのパーティションに定義されたVALUES INリストと照合し、該当するサブパーティションを選択します。
以下に、特定の行がどのようにルーティングされるかを示す例を記載します。ハッシュ段階で割り当てられるパーティションは、ハッシュ関数とパーティション数に依存します。
dept_no | part_no | 例:パーティション | サブパーティション | 理由 |
|---|---|---|---|---|
| 5 | 3 | dp1 | p4 | dept_no=5 は dp1 にハッシュ化されます。part_no=3 は VALUES IN (3, 4) |
| 2 | 6 | dp0 | p2 | dept_no=2 は dp0 にハッシュ化されます; part_no=6 は VALUES IN (5, 6) |
| 9 | 1 | dp2 | p6 | dept_no=9 は dp2 にハッシュされる。part_no=1 は VALUES IN (1, 2) |