【产品名称】
oceanbase社区版
【产品版本】
3.1.0-3.el7
【问题描述】
创建分区表之后尝试加入tablegroup,提示partition options不一致,建表语句如下:
相关语句.txt.zip (1335 KB)
【产品名称】
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。 后续版本是否可以解决上面的问题?