使用上の注意
レベル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 #tbをALTER 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 #tbをALTER 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 #tbをALTER 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 #tbをALTER TABLEGROUP #tgnameまたはALTER TABLEGROUP BY #tbに変更するだけです。
シナリオ4: 非テンプレート化レベル2パーティションの分割
SQL文を実行して、テンプレート化されていないレベル2パーティションを特定のレベル1パーティションの下に分割できます。 他のレベル1パーティションの下の対応するテンプレート化されていないレベル2パーティションは分割されません。
シナリオ3で使用される分割方法は、シナリオ4でも使用することができる。 構文の詳細については、このトピックの「シナリオ3: テンプレート化されたレベル2パーティションの分割」を参照してください。