关于创建tablegroup提示partition options不一致的问题

【产品名称】

oceanbase社区版

【产品版本】

3.1.0-3.el7

【问题描述】

创建分区表之后尝试加入tablegroup,提示partition options不一致,建表语句如下:

相关语句.txt.zip (1335 KB)

绑定table group的表要求分区规则、数量等完全一致。

问题描述中看不到建表语句,请补充下具体细节。

1 建表语句
CREATE TABLE `t_hub_order_item_new` (
  `item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Item顺序ID',
  `mall_id` varchar(32) DEFAULT NULL COMMENT '商城编号',
  `item_code` varchar(32) DEFAULT NULL COMMENT '渠道Item编码',
  `child_id` int(11) DEFAULT NULL COMMENT '行拆单后,ChildItem编号',
  `order_sn` varchar(64) NOT NULL COMMENT '所属渠道订单号',
  `sub_order_id` varchar(64) DEFAULT NULL COMMENT '子订单号',
  `warehouse_id` bigint(20) DEFAULT NULL COMMENT '零售圈ID',
  `goods_id` bigint(20) NOT NULL COMMENT '商品编号',
  `sku_id` bigint(20) NOT NULL COMMENT '商品规格编码',
  `erp_goods_id` varchar(32) DEFAULT NULL COMMENT '商品ERP编号',
  `erp_sku_code` varchar(32) DEFAULT NULL COMMENT '规格ERP编码',
  `goods_name` text DEFAULT NULL COMMENT '商品名称',
  `goods_spec` text DEFAULT NULL COMMENT '商品规格',
  `goods_count` int(11) DEFAULT NULL COMMENT '商品数量',
  `goods_price` float DEFAULT NULL COMMENT '商品销售价格',
  `total_amount` float DEFAULT NULL COMMENT '商品总金额+其他费用',
  `pay_amount` float DEFAULT NULL COMMENT '商品支付金额=总金额-商品级的折扣',
  `pmt_seller` float DEFAULT NULL COMMENT '商品级的商家折扣金额(含均摊)',
  `allocated` tinyint(1) NOT NULL COMMENT '是否已经:并单/拆单到ERP',
  `refunded` tinyint(1) NOT NULL COMMENT '是否已经生成退货单',
  `cancelled` tinyint(1) DEFAULT NULL COMMENT '是否已经:取消并归还库存',
  `erp_order_no` varchar(64) DEFAULT NULL COMMENT '关联的ERP订单编号',
  `rights_status` int(11) NOT NULL COMMENT '维权状态 (0-未维权,1-维权中,2-已退款)',
  `refund_no` varchar(64) DEFAULT NULL COMMENT '退单号,NULL表示未退单',
  `pre_sale_id` bigint(20) DEFAULT NULL COMMENT '预售活动id',
  `author_id` bigint(20) DEFAULT NULL COMMENT '主播id',
  `author_name` varchar(32) DEFAULT NULL COMMENT '主播名称',
  `extra` text DEFAULT NULL COMMENT 'json扩展字段',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) primary_zone = 'zone2;zone3' 
 partition by range columns(create_time)
(partition M202001 values less than ('2021-02-01 00:00:00'),
partition M202102 values less than ('2021-03-01 00:00:00'),
partition M202103 values less than ('2021-04-01 00:00:00'),
partition M202104 values less than ('2021-05-01 00:00:00'),
partition M202105 values less than ('2021-06-01 00:00:00'),
partition M202106 values less than ('2021-07-01 00:00:00'),
partition M202107 values less than ('2021-08-01 00:00:00'),
partition M202108 values less than ('2021-09-01 00:00:00'),
partition M202109 values less than ('2021-10-01 00:00:00'))




2 创建tablegroup语句


CREATE TABLEGROUP od primary_zone = 'zone2;zone3' partition by range columns 1 (
partition M202001 values less than ('2021-02-01 00:00:00'),
partition M202102 values less than ('2021-03-01 00:00:00'),
partition M202103 values less than ('2021-04-01 00:00:00'),
partition M202104 values less than ('2021-05-01 00:00:00'),
partition M202105 values less than ('2021-06-01 00:00:00'),
partition M202106 values less than ('2021-07-01 00:00:00'),
partition M202107 values less than ('2021-08-01 00:00:00'),
partition M202108 values less than ('2021-09-01 00:00:00'),
partition M202109 values less than ('2021-10-01 00:00:00'))


3 加入tablegroup
ALTER TABLE db_biz_hub.t_hub_order_item_new SET TABLEGROUP od;


错误提示:
ERROR 4179 (HY000): table and tablegroup use different partition options not allowed






表分组的分区策略要求跟表的分区策略保持一致。

这里的问题是在定义表分组的分区策略的时候,对列的类型没有办法指定,默认是按字符串去解析的。

而建表的时候指定分区策略时,把那列是按datetime处理的。导致 OB 认为两个类型不一致,从而不能把表加到表分组里。

暂时的办法是改表的列类型为字符串,不过这个也不是很建议,时间列还是用datetime 合适一些。

此外,range分区用表分组的收益并不大,hash分区用表分组收益很大。

我这里使用range分组,是因为我两个表里面的时间字段的取值是完全一样的,做好分区之后,只需要单个分区做join操作就可以了,可以极大的减小join的数据量。 使用tablegroup之后,两个partition在同一分区,有可以避免exchange。 后续版本是否可以解决上面的问题?