OceanBase 不支持针对字符串类型的字段进行Hash分区?

【产品名称】oceanbase-ce

【产品版本】v3.1.1

【问题描述】

# 字段定义 `location` varchar(128) COLLATE utf8mb4_bin, # 分区语句 PARTITION BY HASH(location ) PARTITIONS 64; # 报错信息 ERROR 1659 (HY000): Field ‘location’ is of a not allowed type for this type of partitioning

oceanbase-ce 一下内容来自社区版文档(v3.1.1)

Hash 分区

Hash 分区适合于对不能用 Range 分区、List 分区方法的场景,它的实现方法简单,通过对分区键上的 Hash 函数值来散列记录到不同分区中。如果您的数据符合下列特点,使用 Hash 分区是个很好的选择:

  • 不能指定数据的分区键的列表特征。
  • 不同范围内的数据大小相差非常大,并且很难手动调整均衡。
  • 使用 Range 分区后数据聚集严重。
  • 并行 DML、分区剪枝和分区连接等性能非常重要。

-------------------

其中没有提及分区键类型要求,对比List Columns 分区的说明:

List Columns 分区

List Columns 分区与 List 分区的作用基本相同,不同之处在于:

  • List Columns 分区的分区键不要求是整型,可以是任意类型。
  • List Columns 分区的分区键可以是多列(即列向量)。

---------------------

有提及分区键可以是任意类型。

目前看起来,OceanBase-ce v3.1.1不支持针对字符串类型的字段进行Hash分区?

麻烦提供一下建表的sql文本。

CREATE TABLE `test`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `location` varchar(128) COLLATE utf8mb4_bin,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin PARTITION BY HASH(`location`) PARTITIONS 64;
ERROR 1659 (HY000): Field 'location' is of a not allowed type for this type of partitioning

1、OB兼容MySQL的语法,MySQL针对hash partition也是要求分区键是整形的类型或者返回整形的一个表达式

https://dev.mysql.com/doc/refman/5.7/en/partitioning-hash.html

2、另外贴出来的这个建表语句还有一个地方有问题:分区键要是主键的子集,也就是说主键里要包含分区键。

1 个赞