PolarDB-X的AUTO模式数据库中,所有表都从属且只属于一个表组,同一个表组内的表分区方式一致,同一表组内的表之间的关联查询可以下推到存储节点执行,执行效率得到了很大的提高。本语法仅适用于AUTO模式数据库。

为了方便将表关联到同一个表组,PolarDB-X提供了以下命令,对表组进行管理。

修改表的表组

支持将表的表组修改为任意手动创建的表组。

语法
ALTER TABLE #tbName SET TABLEGROUP=#tgName [force]
限制
说明 本文以将表tb1的表组修改为目标表组mytg1为例说明该语法的限制条件。

执行以下命令,创建表tb1。并通过SHOW topology FROM tb1命令,查看到tb1中的p1分布在存储节点DN1,p2分布在存储节点DN2。

CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
 (
  PARTITION p1 VALUES LESS THAN(20),
  PARTITION p2 VALUES LESS THAN(100)
)

修改表tb1所属的表组为目标表组mytg1,具体限制情况如下表所示:

语法 目标表组分区情况 是否支持执行
不带force:
ALTER TABLE  tb1 SET TABLEGROUP=mytg1
说明 源表和目标表组的分区名称、分区方式(包括分区类型、分区键的个数和分区键的数据类型)完全一致,各个分区对应的物理位置也完全一致(在同一存储节点)时,允许执行该语句。
目标表组mytg1的分区如下:
PARTITION BY RANGE(int) 
(PARTITION p1 VALUES LESS THAN(20),
PARTITION p3 VALUES LESS THAN(100))
分区名称不一致,不允许执行。
目标表组mytg1的分区如下,并且p1分布在存储节点DN1,p2分布在存储节点DN3。
PARTITION BY RANGE(int) 
(PARTITION p1 VALUES LESS THAN(20),   
PARTITION p2 VALUES LESS THAN(100))
源表tb1和目标表组mytg1的分区方式虽然完全一致,但是分区的物理位置不一致,不允许执行。
目标表组mytg1的分区如下,并且p1分布在DN1,p2分布在DN2。
PARTITION BY RANGE(int) 
(PARTITION p1 VALUES LESS THAN(20),   
PARTITION p2 VALUES LESS THAN(100))
源表tb1和mytg1的分区方式完全一致,对应分区的物理位置也完全一致,允许执行,执行成功后将tb1的表组变更为mytg1。
带force option:
ALTER TABLE  tb1 SET TABLEGROUP=mytg1 force
说明 源表和目标表组的分区方式完全相同,但对应分区的物理位置不完全相同,会涉及源表向目标表组分区的数据迁移。

目标表组mytg1的分区如下,并且p1分布在DN1,p2分布在DN3。

PARTITION BY RANGE(int) 
(PARTITION p1 VALUES LESS THAN(20),   
PARTITION p2 VALUES LESS THAN(100))

允许执行,由于源表tb1的p2在DN2,执行成功后会将tb1的p2从DN2迁移到DN3,并且将表组修改为mytg1。

源表tb1和目标表组mytg1的分区键的数据类型或个数不一致。 不允许执行。
目标表组mytg1的分区如下,并且除分区名字外,源表tb1的分区方式与表组mytg1的一致。
PARTITION BY RANGE(int) 
(PARTITION p1 VALUES LESS THAN(20),   
PARTITION p3 VALUES LESS THAN(100))
允许执行。执行成功后tb1的分区名会和表组mytg1保持一致,将tb1的p2重命名为p3,并且将tb1的表组修改为mytg1。
源表tb1和目标表组mytg1的分区方式不一致,并且mytg1的分区如下:
PARTITION BY RANGE(int) 
(PARTITION p1 VALUES LESS THAN(20),   
PARTITION p2 VALUES LESS THAN(60),
PARTITION p3 VALUES LESS THAN(80))

允许执行。会将tb1按照表组mytg1的分区方式做repartition操作,使tb1与表组mytg1的分区方式保持一致,对应分区的物理位置也完全一致,执行成功后tb1的表组变更为mytg1,表tb1的定义如下:

CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
 (PARTITION p1 VALUES LESS THAN(20),
  PARTITION p2 VALUES LESS THAN(60),
  PARTITION p3 VALUES LESS THAN(80)
 )

将表批量添加到指定表组

将表加入到表组中, 当表组为空时,会从table_list中选一个参照表,参照表决定空表组的分区物理位置,重新创建分区组的元数据,其他表通过调整分区向参照表对齐。

语法

ALTER TABLEGROUP #tgName ADD TABLES table_list [force]

限制

此命令的限制与ALTER TABLE #tbName SET TABLEGROUP=#tgName [force]命令保持一致。

说明 PolarDB-X支持将多个表组进行合并,详细步骤请参见 表组合并(AUTO模式)

关于全局二级索引

以上的所有操作同样适用于全局二级索引表,只需要将表名替换为全局二级索引的逻辑名字即可。

示例

执行以下命令,创建表tb1。

CREATE TABLE tb1(a int, b int, global index g1(b) partition by key(b) partitions 3)
PARTITION BY RANGE(a)
 (
  PARTITION p1 VALUES LESS THAN(20),
  PARTITION p2 VALUES LESS THAN(40),
  PARTITION p3 VALUES LESS THAN(60)
)

tb1有一个全局二级索引g1,它的逻辑名字是tb1.g1。执行以下命令,将tb1.g1的表组变更为mytg1。

ALTER TABLE tb1.g1 SET TABLEGROUP=mytg1 force