すべてのプロダクト
Search
ドキュメントセンター

PolarDB:パーティションを複数のパーティションに分割する

最終更新日:Jun 05, 2024

使用上の注意

  • レベル1のパーティションを分割する場合、Alibaba Cloud PolarDB for Xscale (PolarDB-X) インスタンスのバージョンは5.4.14-16539836以降である必要があります。

  • レベル2パーティションを分割する場合、PolarDB-Xインスタンスのバージョンは5.4.17-16952556以降である必要があります。

  • パーティションを複数のパーティションに分割した後、新しいパーティションの定義を指定するときに、新しいパーティションは元のパーティションのデータ制約を満たす必要があります。 そうでない場合、元のデータを新しいパーティションに書き込むことはできません。

用語

  • テーブルグループ: 同一のパーティションキー列を共有する論理テーブルまたはグローバルインデックステーブルのコレクション。

  • グローバルインデックス: パーティションテーブルのインデックス作成手法。 非パーティションキーを使用して、パーティションテーブルにグローバルインデックスを作成できます。 グローバルインデックスは、一意の制約を提供できます。

構文

ALTER { TABLE tbl_name | TABLEGROUP tg_name | TABLEGROUP BY TABLE tbl_name}
split_partition_specs_definition
 | split_subpartition_specs_definition

 
split_partition_specs_definition:
分割パーティションpart_name [INTO (partition_specs_definition)]
| 分割パーティションpart_nameをパーティションに分割partitions_count
| SPLIT PARTITION part_name at(#value) into (partition part_name, partition part_name)

split_subpartition_specs_definition:
SPLIT SUBPARTITION subpartition_name [INTO (subpartition_specs_definition)]
| SPLIT SUBPARTITION subpartition_nameをサブパーティションに分割subpartitions_count
| SPLIT SUBPARTITION subpartition_name at(#value) into (subpartition subpartition_name, subpartition subpartition_name)


partition_specs_definition:
 range_partition_list
 | list_partition_list

subpartition_specs_definition:
 range_subpartition_list
 | list_subpartition_list

range_partition_list:
 (range_partition [, range_partition, ... ] )

range_partition:
 	PARTITION partition_name未満の値 (range_bound_value)

# RANGEまたはRANGE COLUMNSレベル2パーティションを指定します。
range_subpartition_list:
(range_subpartition [, range_subpartition, ... ] )

range_subpartition:
 SUBPARTITION subpartition_name VALUES LESS THAN (range_bound_value) [partition_spec_options]

list_partition_list:
 (list_partition [, list_partition ...])

list_partition:
 	PARTITION partition_name VALUES IN (list_bound_value) [partition_spec_options]

# LISTまたはLIST COLUMNSレベル2パーティションを指定します。
list_subpartition_list:
(list_subpartition [, list_subpartition ...])

list_subpartition:
SUBPARTITION subpartition_name VALUES IN (list_bound_value) [partition_spec_options] 
説明

ALTER TABLEGROUP BY TABLE tbl_nameステートメントを使用すると、ステートメントで指定されたテーブル名に基づいて目的のテーブルグループを自動的に検索し、テーブルグループ内のすべてのテーブルの対応するパーティションを管理できます。 このステートメントの結果は、ALTER TABLEGROUP tg_nameの結果と同じです。これは、テーブルグループ名を指定してテーブルグループ内のテーブルのパーティションを管理するために使用されます。

シナリオ1: レベル2パーティションを含まないレベル1パーティションを分割する

RANGEまたはRANGE COLUMNパーティションの分割

テーブルのパーティションの分割

たとえば、tb1は次のSQL文を使用して作成および定義されます。

CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
 (PARTITION p1の値は (20) よりも少なく、 
 PARTITION p2の値は (100)) 

次のSQL文を実行して、p1パーティションをp10、p11、およびp12パーティションに分割できます。

ALTER TABLE tb1分割パーティションp1 INTO
(PARTITION p10の値は (8) よりも少ない) 、パートp11の値は (15) 未満、PARTITION p12値未満 (20) 

RANGEパーティション分割方法を使用してパーティション分割されるテーブルの場合、PolarDB-Xは、範囲に基づいてパーティションを2つのパーティションに分割するための構文解析を提供します。 たとえば、次のステートメントを実行して、tb1テーブルのp1パーティションを分割できます。

ALTER TABLE tb1分割パーティションp1 AT(9) INTO (パーティションp11、パーティションp12)

上記のSQL文の結果は、次の文の結果と同じです。

ALTER TABLE tb1分割パーティションp1 INTO
(PARTITION p11の値は (9) よりも少なく、PARTITION p12は (20) より少ない値を示します。

テーブルグループのパーティションの分割

説明

テーブルグループのパーティションを分割すると、テーブルグループ内のすべてのテーブルの対応するパーティションが同期的に分割されます。

たとえば、tb1テーブルのパーティション定義はtb2テーブルのパーティション定義と同じであり、2つのテーブルはmytg1テーブルグループにあります。 この例では、テーブルグループは一意である必要があり、mytg1が使用されます。

作成tablegroup mytg1;
CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
 (PARTITION p1の値は (20) よりも少なく、 
 PARTITION p2値が (100) 未満) tablegroup=mytg1;
 
CREATE TABLE tb2(a int) PARTITION BY RANGE(a)
 (PARTITION p1の値は (20) よりも少なく、 
 PARTITION p2値が (100) 未満) tablegroup=mytg1; 

次のSQL文を実行して、mytg1テーブルグループのp1パーティションをp10、p11、およびp12パーティションに分割できます。 これは、tb1のp1パーティションとtb2のp1パーティションの両方が、p10、p11、およびp12パーティションに分割されていることを示している。

ALTER TABLEGROUP mytg1分割パーティションp1 INTO
(PARTITION p10の値は (8) よりも少ない) 、パートp11の値は (15) 未満、PARTITION p12値未満 (20) 

RANGEパーティション分割方法を使用してテーブルがパーティション分割されているテーブルグループの場合、PolarDB-Xは、範囲に基づいてパーティションを2つのパーティションに分割するための構文糖を提供します。 たとえば、次のステートメントを実行して、mytg1テーブルグループのp1パーティションを分割できます。

ALTER TABLEGROUP mytg1分割パーティションp1 AT(9) INTO (パーティションp11、パーティションp12)

上記のSQL文の結果は、次の文の結果と同じです。

ALTER TABLEGROUP mytg1分割パーティションp1 INTO
(PARTITION p11の値は (9) よりも少なく、PARTITION p12は (20) より少ない値を示します。

LISTまたはLIST COLUMNパーティションの分割

テーブルのパーティションの分割

たとえば、tb1は次のSQL文を使用して作成および定義されます。

CREATE TABLE tb1(a int) PARTITION BY LIST(a)
 (PARTITION p1の値 (1、2、3、4、5、6) 、 
 PARTITION p2の値 (7,8、9) 、
 PARTITION p3 VALUES IN (デフォルト) 

次のSQL文を実行して、p1パーティションをp10、p11、およびp12パーティションに分割できます。

ALTER TABLE tb1分割パーティションp1 INTO
((1,3、5) の部分p10値、PARTITION p11の値 (2,4) 、パーティションp12の値 (6) 

p3パーティションは、パーティションキー値が1〜9でない行をキャプチャする既定のパーティションです。 PolarDB-Xを使用すると、デフォルトのパーティションを分割できます。 デフォルトパーティションを分割すると、デフォルトパーティション内の一部の値が新しいパーティションに移行されます。 たとえば、次のSQL文を実行して、p3パーティションをp30、p31、およびp32という名前の3つのパーティションに分割し、値10〜15をp30およびp31パーティションに移行できます。

ALTER TABLE tb1分割パーティションp3 INTO
(PARTITION p30の値 (10,11、12) 、PARTITION p31の値 (13,14、15) 、PARTITION p32 VALUES IN (デフォルト) 

テーブルグループのパーティションの分割

説明

テーブルグループのパーティションを分割すると、テーブルグループ内のすべてのテーブルの対応するパーティションが同期的に分割されます。

たとえば、tb1テーブルのパーティション定義はtb2テーブルのパーティション定義と同じであり、2つのテーブルはmytg1テーブルグループにあります。 この例では、テーブルグループは一意である必要があり、mytg1が使用されます。

作成tablegroup mytg1;
CREATE TABLE tb1(a int) PARTITION BY LIST(a)
 (PARTITION p1の値 (1、2、3、4、5、6) 、 
 PARTITION p2の値 (7,8、9) 、
 PARTITION p3 VALUES IN (デフォルト)) tablegroup=mytg1;
 
CREATE TABLE tb2(a int) PARTITION BY LIST(a)
 (PARTITION p1の値 (1、2、3、4、5、6) 、 
 PARTITION p2の値 (7,8、9) 、
 PARTITION p3 VALUES IN (デフォルト)) tablegroup=mytg1; 

次のSQL文を実行して、p1パーティションをp10、p11、およびp12パーティションに分割できます。 これは、tb1のp1パーティションとtb2のp1パーティションの両方が、p10、p11、およびp12パーティションに分割されていることを示している。

ALTER TABLEGROUP mytg1分割パーティションp1 INTO
((1,3、5) の部分p10値、PARTITION p11の値 (2,4) 、パーティションp12の値 (6) 

p3パーティションは、パーティションキー値が1〜9でない行をキャプチャする既定のパーティションです。 PolarDB-Xを使用すると、デフォルトのパーティションを分割できます。 デフォルトパーティションを分割すると、デフォルトパーティション内の一部の値が新しいパーティションに移行されます。 たとえば、次のSQL文を実行して、p3パーティションをp30、p31、およびp32という名前の3つのパーティションに分割し、値10〜15をp30およびp31パーティションに移行できます。

ALTER TABLEGROUP mytg1分割パーティションp3 INTO
(PARTITION p30の値 (10,11、12) 、PARTITION p31の値 (13,14、15) 、PARTITION p32 VALUES IN (デフォルト) 

HASHまたはKEYパーティションの分割

テーブルのパーティションの分割

たとえば、tb1は次のSQL文を使用して作成および定義されます。

CREATE TABLE tb1(a int) PARTITION BY key(a) パーティション3;

デフォルトでは、3つのパーティションの名前はp1、p2、およびp3です。

次のSQL文を実行して、元のp1パーティションのハッシュ値の範囲に基づいてp1パーティションを2つのパーティションに分割できます。

ALTER TABLE tb1分割パーティションp1

パーティションを指定した数のパーティションに分割することもできます。 たとえば、次のSQL文を実行して、元のp2パーティションのハッシュ値の範囲に基づいてp2パーティションを5つのパーティションに分割できます。

ALTER TABLE tb1分割パーティションp2 INTOパーティション5

テーブルグループのパーティションの分割

説明

テーブルグループのパーティションを分割すると、テーブルグループ内のすべてのテーブルの対応するパーティションが同期的に分割されます。

たとえば、tb1テーブルのパーティション定義はtb2テーブルのパーティション定義と同じであり、2つのテーブルはmytg1テーブルグループにあります。 この例では、テーブルグループは一意である必要があり、mytg1が使用されます。

テーブルグループの作成mytg1;
CREATE TABLE tb1(a int) PARTITION BY key(a) partitions 3 tablegroup=mytg1;
CREATE TABLE tb2(a int) PARTITION BY key(a) partitions 3 tablegroup=mytg1; 

デフォルトでは、tb1テーブルとtb2テーブルの両方の3つのパーティションはp1、p2、およびp3という名前です。

次のSQL文を実行して、元のp1パーティションのハッシュ値の範囲に基づいて、mytg1テーブルグループのp1パーティションを2つのパーティションに分割できます。

ALTER tablegroup mytg1分割パーティションp1

パーティションを指定した数のパーティションに分割することもできます。 たとえば、次のSQL文を実行して、元のp2パーティションのハッシュ値の範囲に基づいてp2パーティションを5つのパーティションに分割できます。

ALTER tablegroup mytg1分割パーティションp2をパーティション5に分割

シナリオ2: レベル2パーティションを含むレベル1パーティションを分割する

シナリオ1で使用される分割方法は、シナリオ2でも使用することができる。

テーブルのパーティションの分割

テンプレート化されていないレベル2パーティションの場合、レベル1パーティションを分割するときにレベル2パーティションを再定義できます。 次のステートメントは、テンプレート化されていないレベル2パーティションを持つテーブルを作成するために使用されます。

テーブルの作成t1 (
bigint unsigned NOT null、b bigint unsigned NOT null,
c datetime NOT NULL,
d varchar (16) NOT NULL,
e varchar (16) NOT NULL
)
キーによるパーティション (a、b) パーティション4
サブパーティションBY range columns (c,d)
(
パーティションp1
(
サブパーティションp1sp1の値が ('2020-01-01 '、'abc') 未満、サブパーティションp1sp2値が (maxvalue, maxvalue) 未満
),
パーティションp2
(
サブパーティションp2sp1の値が ('2020-01-01 '、'abc') 未満、サブパーティションp2sp2値が ('2021-01-01 '、'abc') 未満、サブパーティションp2sp3未満の値 ('2022-01-01 '、'abc') 、サブパーティションp2sp4値が (maxvalue, maxvalue) 未満
),
パーティションp3
(
サブパーティションp3sp1値が ('2020-01-01 '、'abc') 未満、サブパーティションp3sp2値が (maxvalue, maxvalue) 未満
),
パーティションp4
(
サブパーティションp4sp1の値が ('2020-01-01 '、'abc') 未満、サブパーティションp4sp2値が (maxvalue, maxvalue) 未満
)
); 

次のSQL文を実行して、シナリオ1で行ったのと同じ方法でレベル1のパーティションを分割できます。

ALTER TABLE t1分割パーティションp1;

レベル1のパーティションを分割するときに、レベル2のパーティションを再定義できます。

ALTER TABLE t1分割パーティションp1 INTO (
 パーティションp10 (サブパーティションp10sp1の値が ('2020-01-01 '、'abc') 未満) 、
 サブパーティションp10sp2未満の値 ('2022-01-01 '、'abc') 、
 サブパーティションp10sp3値が (maxvalue, maxvalue) より小さい、
 パーティションp11 (サブパーティションp11sp1値が (maxvalue, maxvalue) より小さい); 

上記のステートメントを使用して、p1パーティションをp10とp11という名前の2つのレベル1パーティションに分割し、p10パーティションに3つのレベル2パーティションが含まれ、p11パーティションに1つのレベル2パーティションが含まれるように指定します。

重要

新しく定義されたレベル2パーティションは、元のパーティションのデータ制約を満たす必要があります。 そうしないと、分割後に元のデータを新しいパーティションに書き込むことができません。

テンプレート化されたレベル2パーティションの場合、レベル1パーティションを分割するときにレベル2パーティションの定義を変更することはできません。

テーブルグループのパーティションの分割

テーブルに対して行ったのと同じ方法で、テーブルグループのパーティションを分割できます。 ALTER TABLE #tbALTER TABLEGROUP #tgnameまたはALTER TABLEGROUP BY #tbに変更するだけです。

シナリオ3: テンプレート化されたレベル2パーティションを分割する

SQL文を実行して、テンプレート化されたレベル2パーティションを分割できます。 すべてのレベル1パーティションの下の対応するテンプレート化レベル2パーティションが分割されます。

テンプレート化されたRANGEまたはRANGE COLUMNレベル2パーティションを分割する

テーブルのパーティションの分割

たとえば、tb1は次のSQL文を使用して作成および定義されます。

テーブルの作成tb1 (
bigint unsigned NOT null、b bigint unsigned NOT null,
c bigint NOT NULL,
d varchar (16) NOT NULL,
e varchar (16) NOT NULL
)
キーによるパーティション (a、b) パーティション4
サブパーティションBY range (c) (
 サブパーティションsp1値が (1000) 未満、
 サブパーティションsp2値が (2000) 未満、
 サブパーティションsp3値未満 (maxvalue)
); 

次のSQL文を実行して、sp2パーティションをsp20、sp21、およびsp22パーティションに分割できます。

ALTER TABLE tb1分割サブパーティションsp2 INTO
(パーティションsp20値未満 (1200) 、パーティションsp21値が (1600) 未満、パーティションsp22値未満 (2000) 

RANGEパーティション分割方法を使用してパーティション分割されるテーブルの場合、PolarDB-Xは、範囲に基づいてパーティションを2つのパーティションに分割するための構文解析を提供します。 たとえば、次のSQL文を実行して、tb1テーブルのsp2パーティションを分割できます。

ALTER TABLE tb1スプリットサブパーティションsp2 at(1600) INTO
(サブパーティションsp21、サブパーティションp22) 

上記のSQL文の結果は、次の文の結果と同じです。

ALTER TABLE tb1分割サブパーティションsp2 INTO
(パーティションsp21値が (1600) 未満、パーティションsp22値未満 (2000); 

テーブルグループのパーティションの分割

説明

テーブルグループのパーティションを分割すると、テーブルグループ内のすべてのテーブルの対応するパーティションが同期的に分割されます。

テーブルに対して行ったのと同じ方法で、テーブルグループのパーティションを分割できます。 ALTER TABLE #tbALTER TABLEGROUP #tgnameまたはALTER TABLEGROUP BY #tbに変更するだけです。

テンプレート化されたLISTまたはLIST COLUMNレベル2パーティションを分割する

テーブルのパーティションの分割

たとえば、tb1は次のSQL文を使用して作成および定義されます。

テーブルの作成tb1 (
bigint unsigned NOT null、b bigint unsigned NOT null,
c datetime NOT NULL,
d varchar (16) NOT NULL,
e varchar (16) NOT NULL
)
キーによるパーティション (a、b) パーティション4
サブパーティションBYリスト (to_days(c)) (
サブパーティションsp1 VALUES IN ( to_days('2020-01-01 ') 、to_days('2020-02-01') 、to_days('2020-03-01 ') 、to_days('2020-04-01') ) 、サブパーティションsp2 VALUES IN (デフォルト)
); 

次のSQL文を実行して、sp1パーティションをsp10、sp11、およびsp12パーティションに分割できます。

ALTER TABLE tb1分割サブパーティションsp1 INTO
(サブパーティションsp10 VALUES IN (to_days('2020-01-01 '))) 、サブパーティションsp11 VALUES IN (to_days('2020-02-01 ') 、to_days('2020-04-01')) 、サブパーティションsp12 VALUES IN (to_days('2020-03-01 ')) 

sp2パーティションは、c列の値が「2020-01-01」、「2020-02-01」、「2020-03-01」、または「2020-04-01」ではない行をキャプチャするデフォルトパーティションです。 c列はパーティションキー列です。 PolarDB-Xを使用すると、デフォルトのパーティションを分割できます。 デフォルトパーティションを分割すると、デフォルトパーティション内の一部の値が新しいパーティションに移行されます。 たとえば、次のSQL文を実行して、sp2パーティションをsp20、sp21、およびsp22という名前の3つのパーティションに分割し、値「2023-01-01」をsp20パーティションに、値「2023-02-01」および「2023-03-01」をsp21パーティションに移行できます。

ALTER TABLE tb1分割サブパーティションsp2 INTO
(サブパーティションsp20 VALUES IN (to_days('2023-01-01 '))) 、サブパーティションsp21 VALUES IN (to_days('2023-02-01 '),to_days('2023-03-01')),
サブパーティションsp22 VALUES IN (デフォルト) 

テーブルグループのパーティションの分割

説明

テーブルグループのパーティションを分割すると、テーブルグループ内のすべてのテーブルの対応するパーティションが同期的に分割されます。

テーブルに対して行ったのと同じ方法で、テーブルグループのパーティションを分割できます。 ALTER TABLE #tbALTER TABLEGROUP #tgnameまたはALTER TABLEGROUP BY #tbに変更するだけです。

テンプレート化されたHASHまたはKEYレベル2パーティションを分割する

テーブルのパーティションの分割

たとえば、tb1は次のSQL文を使用して作成および定義されます。

テーブルの作成tb1 (
bigint unsigned NOT null、b bigint unsigned NOT null,
c datetime NOT NULL,
d varchar (16) NOT NULL,
e varchar (16) NOT NULL
)
キーによるパーティション (c、d) パーティション3
サブパーティションBYキー (a、b) サブパーティション3; 

デフォルトでは、レベル1パーティションはp1、p2、およびp3という名前であり、テンプレート化されたレベル2パーティションはsp1、sp2、およびsp3という名前である。

次のSQL文を実行して、元のsp1パーティションのハッシュ値の範囲に基づいて、sp1パーティションを2つのパーティションに分割できます。

ALTER TABLE tb1分割サブパーティションsp1

パーティションを指定した数のパーティションに分割することもできます。 たとえば、次のSQL文を実行して、元のsp2パーティションのハッシュ値の範囲に基づいてsp2パーティションを5つのパーティションに分割できます。

ALTER TABLE tb1分割サブパーティションsp2 INTOサブパーティション5

テーブルグループのパーティションの分割

説明

テーブルグループのパーティションを分割すると、テーブルグループ内のすべてのテーブルの対応するパーティションが同期的に分割されます。

テーブルに対して行ったのと同じ方法で、テーブルグループのパーティションを分割できます。 ALTER TABLE #tbALTER TABLEGROUP #tgnameまたはALTER TABLEGROUP BY #tbに変更するだけです。

シナリオ4: 非テンプレート化レベル2パーティションの分割

説明

SQL文を実行して、テンプレート化されていないレベル2パーティションを特定のレベル1パーティションの下に分割できます。 他のレベル1パーティションの下の対応するテンプレート化されていないレベル2パーティションは分割されません。

シナリオ3で使用される分割方法は、シナリオ4でも使用することができる。 構文の詳細については、このトピックの「シナリオ3: テンプレート化されたレベル2パーティションの分割」を参照してください。