功能描述
显式创建分区亲和性策略。亲和性可用于控制数据的放置方式以及数据之间的亲和关系使其在自动调度时遵守预设的策略。通过亲和性策略,用户可实现将不同表的分区绑定在同一物理节点,减少分布式开销的效果,适合关联查询频繁的表组。
功能限制
数据分布策略目前仅支持 HASH 和 KEY 分区的一级分区表。
RANGE/RANGE COLUMNS 分区表可绑定时间调度数据分布策略,实现冷数据自动归档(EXPIRE、START_TIME、END_TIME)。
只有未绑定任何数据对象的数据分布策略才能被修改或删除。
v21.6.3.0 版本起支持通过
WITH 子句预分裂 Region(mode、num_region、split_keys 选项),该子句仅能在创建时指定,创建后不支持修改,且 num_region 与 split_keys 不能同时指定。语法
CREATE PARTITION POLICY [IF NOT EXISTS] partition_policy_name[partition_clause] [opt_using_distribution_policy][opt_with_pp_options];partition_clause:PARTITION BY HASH (INT) PARTITIONS partition_num|PARTITION BY KEY COLUMNS columns_num PARTITIONS partition_numopt_using_distribution_policy:USING DISTRIBUTION POLICY distribution_policy_nameopt_with_pp_options:WITH (pp_option [, pp_option] ...)pp_option:mode = 'logical_split'|num_region = num|split_keys = 'split_key_1,split_key_2,...'
参数说明
参数 | 是否必选 | 说明 |
partition_policy_name | 必选 | 分区亲和性策略的名称。 |
partition_clause | 可选 | 用于指定分区亲和性策略的结构。 如果不指定,则创建的是非分区结构的亲和性策略(用于普通表的绑定)。 如果指定,则创建具有分区结构的亲和性策略(用于分区表的绑定)。 其中 partition_num 指定分区数量,columns_num 指分区列的数量,只有当分区表的属性与之相符时,才能绑定成功。 |
opt_using_distribution_policy | 可选 | 用于指定亲和性策略是否绑定了分布式策略。请提前创建数据分布策略,详细请咨询技术支持工程师。 |
mode | 可选 | WITH 子句选项,指定亲和性策略的分裂模式,当前仅支持取值 logical_split(逻辑预分裂)。指定该选项后,可搭配 num_region 或 split_keys 预分裂 Region,目前 logical_split 仅在 HBase 模式下使用。 |
num_region | 可选 | WITH 子句选项,指定预分裂的 Region 数量,取值范围为 1 - 8192。必须与 mode = 'logical_split' 一起指定,且不能与 split_keys 同时指定。 |
split_keys | 可选 | WITH 子句选项,指定预分裂的切分点列表,多个切分点使用英文逗号分隔,每个切分点须为偶数位十六进制字符串,且按升序排列,最多支持 8191 个切分点。必须与 mode = 'logical_split' 一起指定,且不能与 num_region 同时指定。 |
示例
创建非分区结构的亲和性策略。
tdsql [(none)]> CREATE PARTITION POLICY pp1;Query OK, 0 rows affected (0.07 sec)tdsql [test]> CREATE TABLE tbl1(id INT) USING PARTITION POLICY pp1;Query OK, 0 rows affectedtdsql [test]> CREATE TABLE tbl2(id INT) USING PARTITION POLICY pp1;Query OK, 0 rows affected
在上述策略下,tbl1 和 tbl2 会保持在同一个节点存放。
创建一级 HASH 4分区结构的亲和性策略。
tdsql [(none)]> CREATE PARTITION POLICY pp2 PARTITION BY HASH(INT) PARTITIONS 4;Query OK, 0 rows affected (0.02 sec)
创建非分区结构的亲和性策略(绑定了数据分布策略)。
tdsql [(none)]> CREATE PARTITION POLICY pp3 USING DISTRIBUTION POLICY dp_1;Query OK, 0 rows affected (0.01 sec)
创建一级 HASH 4分区结构的亲和性策略(绑定了数据分布策略)。
tdsql [(none)]> CREATE PARTITION POLICY pp4-> PARTITION BY HASH(INT)-> PARTITIONS 4-> USING DISTRIBUTION POLICY dp_2;Query OK, 0 rows affected (0.02 sec)
创建一级 KEY 分区列数为2,分区数为4的亲和性策略。
tdsql [(none)]> CREATE PARTITION POLICY pp2-> PARTITION BY KEY COLUMNS 2-> PARTITIONS 4;Query OK, 0 rows affected (0.02 sec)
创建亲和性策略,通过
num_region 预分裂为16个 Region。tdsql [(none)]> CREATE PARTITION POLICY pp5 WITH (mode = 'logical_split', num_region = 16);Query OK, 0 rows affected (0.02 sec)
创建亲和性策略,通过
split_keys 指定切分点列表进行预分裂。tdsql [(none)]> CREATE PARTITION POLICY pp6 WITH (mode = 'logical_split', split_keys = '40,80,C0');Query OK, 0 rows affected (0.02 sec)
创建绑定分区亲和性策略的表。
# 创建分区亲和性策略(hash 4分区)tdsql [test]> CREATE PARTITION POLICY pp2 PARTITION BY HASH(INT) PARTITIONS 4;Query OK, 0 rows affected# 建表tdsql [test]> CREATE TABLE orders(id INT) PARTITION BY HASH(id) PARTITIONS 4 USING PARTITION POLICY pp2;Query OK, 0 rows affectedtdsql [test]> CREATE TABLE order_details(id INT, oid, detail TEXT) PARTITION BY HASH(oid) PARTITIONS 4 USING PARTITION POLICY pp2;Query OK, 0 rows affected
通过上述 SQL,表 orders 和 order_details 的 HASH 分区会进行亲和性绑定,使得 HASH 值一致的分区在放置以及调度迁移的时候保持在相同节点。