首批通过分布式安全可靠测评,为关键业务系统打造
将表添加到表组
更新时间:2026-06-18 14:56:11
创建表组后,可以将符合条件的表加入到表组。
使用限制
OceanBase 数据库升级过程中,禁止使用 ALTER TABLEGROUP 语句向表组中添加表。
注意事项
带有分区权重的表可以被添加到表组中,但添加到表组后,可能会影响表组的整体分布。带分区权重的表加入表组后对原表组的具体影响如下表所示。
| 表组的 SHARDING 属性 | 原来的分区分布方式 | 带分区权重后的影响 |
|---|---|---|
| NONE | 全部聚合 | 无影响 |
| PARTITION | 各表的一级分区内 Value 相同的分区聚合(同一分区组);一级分区之间打散。 | 少数带权重的分区会影响表组的整体分布。 |
| ADAPTIVE |
|
表组内全部是一级分区表时,少数带权重的分区会影响表组的整体分布。由于目前暂不支持对二级分区表设置分区权重,故表组内全部是二级分区表的场景暂不涉及。 |
说明
如果表组添加了表组权重,则表组中的表级、分区级权重无效。有关添加表组权重的介绍信息,参见 SET_TABLEGROUP_BALANCE_WEIGHT。
前提条件
将表加入表组前,需要查看表组属性及表组内表的分区信息,以确认当前表是否满足加入表组的条件。查看表组信息的详细操作请参见 查看表组信息。
指定所属的表组时,待创建的表需要满足加入该表组的条件。
对于
SHARDING属性为NONE的表组,对待创建的表没有任何限制。表组中可以同时有非分区表、一级分区表和二级分区表。说明
将表添加到
SHARDING = 'NONE'属性的表组中时,如果该表有全局索引,那么系统会自动将全局索引与这个表组进行绑定,以提高性能。有关全局索引的详细信息,参见 全局索引。对于
SHARDING属性为PARTITION的表组,要求待创建的表其对应的一级分区必须与表组中所有表的一级分区的分区定义一致,包括分区类型、分区个数、分区值。表组中可以同时有一级分区表和二级分区表。也支持表组中全部是非分区表。相同的分区定义具体指:
- 分区类型相同,例如,都是 Range 分区。
- 如果是 Hash 分区,要求引用的列数相同,并且分区个数相同。
- 如果是 Range 分区,要求引用的列数相同,分区数相同,Range 分割点也相同。
对于
SHARDING属性为ADAPTIVE的表组,要求待创建的表其对应的一级分区和二级分区必须与表组中所有表的一级分区和二级分区的分区定义一致,包括分区类型、分区个数、分区值。表组中必须全是一级分区表或全是二级分区表。也支持表组中全部是非分区表。相同的分区定义具体指:
- 分区类型相同(例如,都是 Hash + Range 分区)。
- 如果是 Hash 分区,要求引用的列数相同,并且分区个数相同。
- 如果是 Range 分区,要求引用的列数相同,分区数相同,Range 分割点也相同。
- 对于二级分区,根据其分区类型,与一级分区的要求相同。
创建表时将表指定给表组
创建表组后,如果表还未创建,可以在创建表时通过指定表组的方式将表指定给表组。语句如下。
CREATE TABLE table_name column_definition TABLEGROUP = tablegroup_name [partition_option];
语句使用说明:
执行该语句需要确保当前用户拥有表的
ALTER权限。column_definition:定义表的列名及数据类型。TABLEGROUP:指定表所属的表组。partition_option:定义表的分区信息。
创建表并加表加入表组的示例如下:
创建表加入到
SHARDING属性为NONE的表组。创建一个
SHARDING属性为NONE的表组tblgroup1。CREATE TABLEGROUP tblgroup1 SHARDING = 'NONE';创建一个非分区表
tbl1并指定加入到表组tblgroup1。CREATE TABLE tbl1 (col int) TABLEGROUP = tblgroup1;创建一个一级分区表
tbl2并指定加入到表组tblgroup1。CREATE TABLE tbl2 (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50)) TABLEGROUP = tblgroup1 PARTITION BY LIST(col1) ( PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );查看表组中的表。
SELECT * FROM oceanbase.DBA_OB_TABLEGROUP_TABLES WHERE tablegroup_name = 'tblgroup1';结果如下:
+-----------------+-------+------------+----------+ | TABLEGROUP_NAME | OWNER | TABLE_NAME | SHARDING | +-----------------+-------+------------+----------+ | tblgroup1 | test | tbl1 | NONE | | tblgroup1 | test | tbl2 | NONE | +-----------------+-------+------------+----------+ 2 rows in set
创建表加入到
SHARDING属性为PARTITION的表组。创建一个
SHARDING属性为PARTITION的表组tblgroup2。CREATE TABLEGROUP tblgroup2 SHARDING = 'PARTITION';创建一个一级分区表
tbl3并指定加入到表组tblgroup2。CREATE TABLE tbl3 (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50)) TABLEGROUP = tblgroup2 PARTITION BY LIST(col1) (PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );创建一个与表
tbl3分区类型、分区个数及分区值均相同的表tbl4并指定加入到表组tblgroup2。CREATE TABLE tbl4 (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50)) TABLEGROUP = tblgroup2 PARTITION BY LIST(col1) (PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );查看表组中的表。
SELECT * FROM oceanbase.DBA_OB_TABLEGROUP_TABLES WHERE tablegroup_name = 'tblgroup2';结果如下:
+-----------------+-------+------------+-----------+ | TABLEGROUP_NAME | OWNER | TABLE_NAME | SHARDING | +-----------------+-------+------------+-----------+ | tblgroup2 | test | tbl3 | PARTITION | | tblgroup2 | test | tbl4 | PARTITION | +-----------------+-------+------------+-----------+ 2 rows in set
创建表加入到
SHARDING属性为ADAPTIVE的表组。创建一个
SHARDING属性为ADAPTIVE的表组tblgroup3。CREATE TABLEGROUP tblgroup3 SHARDING = 'ADAPTIVE';创建一个二级分区表
tbl5并指定加入到表组tblgroup3。CREATE TABLE tbl5(col1 INT,col2 varchar(50)) TABLEGROUP = tblgroup3 PARTITION BY LIST(col1) SUBPARTITION BY LIST COLUMNS(col2) (PARTITION p0 VALUES in (01) (SUBPARTITION mp0 VALUES in ('01'), SUBPARTITION mp1 VALUES in ('02'), SUBPARTITION mp2 VALUES in ('03') ), PARTITION p1 VALUES in (02) (SUBPARTITION mp3 VALUES in ('01'), SUBPARTITION mp4 VALUES in ('02'), SUBPARTITION mp5 VALUES in ('03')) );创建一个与表
tbl5分区类型、分区个数及分区值均相同的表tbl6并指定加入到表组tblgroup3。CREATE TABLE tbl6(col1 INT,col2 varchar(50)) TABLEGROUP = tblgroup3 PARTITION BY LIST(col1) SUBPARTITION BY LIST COLUMNS(col2) (PARTITION p0 VALUES in (01) (SUBPARTITION mp0 VALUES in ('01'), SUBPARTITION mp1 VALUES in ('02'), SUBPARTITION mp2 VALUES in ('03') ), PARTITION p1 VALUES in (02) (SUBPARTITION mp3 VALUES in ('01'), SUBPARTITION mp4 VALUES in ('02'), SUBPARTITION mp5 VALUES in ('03')) );查看表组中的表。
SELECT * FROM oceanbase.DBA_OB_TABLEGROUP_TABLES WHERE tablegroup_name = 'tblgroup3';结果如下:
+-----------------+-------+------------+----------+ | TABLEGROUP_NAME | OWNER | TABLE_NAME | SHARDING | +-----------------+-------+------------+----------+ | tblgroup3 | test | tbl5 | ADAPTIVE | | tblgroup3 | test | tbl6 | ADAPTIVE | +-----------------+-------+------------+----------+ 2 rows in set
向表组中添加已存在的表
创建表组后,如果表已存在,且满足加入表组的条件,则可以通过 ALTER TABLEGROUP 语句向表组中添加表。语句如下。
ALTER TABLEGROUP tablegroup_name ADD [TABLE] table_name [, table_name...];
语句使用说明:
执行该语句需要确保当前用户拥有全局
ALTER权限。tablegroup_name:待添加表的表组。table_name:待添加的表。同时添加多个表时,不同表名之间用英文逗号(,)分隔。当添加多个表时,允许表名重复。如果待添加的表已经在当前表组中,系统不会报错。
向表组中添加已存在的表的示例如下:
将已存在的表添加到
SHARDING属性为NONE的表组中。创建一个
SHARDING属性为NONE的表组tblgroup4。CREATE TABLEGROUP tblgroup4 SHARDING = 'NONE';创建一个非分区表
tbl7和一个一级分区表tbl8。CREATE TABLE tbl7 (col int);CREATE TABLE tbl8 (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50)) PARTITION BY LIST(col1) ( PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );将表
tbl7和tbl8同时添加到表组tblgroup4中。ALTER TABLEGROUP tblgroup4 ADD tbl7,tbl8;查看表组中的表。
SELECT * FROM oceanbase.DBA_OB_TABLEGROUP_TABLES WHERE tablegroup_name = 'tblgroup4';结果如下:
+-----------------+-------+------------+----------+ | TABLEGROUP_NAME | OWNER | TABLE_NAME | SHARDING | +-----------------+-------+------------+----------+ | tblgroup4 | test | tbl7 | NONE | | tblgroup4 | test | tbl8 | NONE | +-----------------+-------+------------+----------+ 2 rows in set
将已存在的表添加到
SHARDING属性为PARTITION的表组中。创建一个
SHARDING属性为PARTITION的表组tblgroup5。CREATE TABLEGROUP tblgroup5 SHARDING = 'PARTITION';创建两个分区定义相同的一级分区表
tbl9和tbl10。CREATE TABLE tbl9 (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50)) PARTITION BY LIST(col1) (PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );CREATE TABLE tbl10 (col1 BIGINT PRIMARY KEY,col2 VARCHAR(50)) PARTITION BY LIST(col1) (PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );将表
tbl9和tbl10同时添加到表组tblgroup5中。ALTER TABLEGROUP tblgroup5 ADD tbl9,tbl10;查看表组中的表。
SELECT * FROM oceanbase.DBA_OB_TABLEGROUP_TABLES WHERE tablegroup_name = 'tblgroup5';结果如下:
+-----------------+-------+------------+-----------+ | TABLEGROUP_NAME | OWNER | TABLE_NAME | SHARDING | +-----------------+-------+------------+-----------+ | tblgroup5 | test | tbl9 | PARTITION | | tblgroup5 | test | tbl10 | PARTITION | +-----------------+-------+------------+-----------+ 2 rows in set
将已存在的表添加到
SHARDING属性为ADAPTIVE的表组中。创建一个
SHARDING属性为ADAPTIVE的表组tblgroup6。CREATE TABLEGROUP tblgroup6 SHARDING = 'ADAPTIVE';创建两个分区定义相同的模板化二级分区表
tbl11和tbl12。CREATE TABLE tbl11(col1 int,col2 int) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(2020), SUBPARTITION mp1 VALUES LESS THAN(2021), SUBPARTITION mp2 VALUES LESS THAN(2022)) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200));CREATE TABLE tbl12(col1 int,col2 int) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(2020), SUBPARTITION mp1 VALUES LESS THAN(2021), SUBPARTITION mp2 VALUES LESS THAN(2022)) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200));将表
tbl11和tbl12同时添加到表组tblgroup6中。ALTER TABLEGROUP tblgroup6 ADD tbl11,tbl12;查看表组中的表。
SELECT * FROM oceanbase.DBA_OB_TABLEGROUP_TABLES WHERE tablegroup_name = 'tblgroup6';结果如下:
+-----------------+-------+------------+----------+ | TABLEGROUP_NAME | OWNER | TABLE_NAME | SHARDING | +-----------------+-------+------------+----------+ | tblgroup6 | test | tbl11 | ADAPTIVE | | tblgroup6 | test | tbl12 | ADAPTIVE | +-----------------+-------+------------+----------+ 2 rows in set