一、功能限制
·数据分布策略目前仅支持 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_num opt_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 值一致的分区在放置以及调度迁移的时候保持在相同节点。