【 TiDB 使用环境】生产环境
表结构
CREATE TABLE `synrpt_tt_promotion20250106` (
`advertiser_id` bigint(20) NOT NULL COMMENT '广告账户id',
`project_id` bigint(20) NOT NULL COMMENT '项目ID',
`promotion_id` bigint(32) NOT NULL COMMENT '广告ID',
`date` char(10) NOT NULL COMMENT '日期',
`hour` int(2) NOT NULL COMMENT '小时',
`click_cnt` varchar(10) DEFAULT NULL COMMENT '当用户点击广告素材时,触发点击事件,该事件被认为是一次有效的广告点击。',
`cost` bigint(20) unsigned NOT NULL,
`cost1` decimal(10,3) DEFAULT NULL,
`cost2` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
tikv, sum bigint类型的字段正常, 但是换tiflash会被cast 转义成decimal
tiflash这么处理导致没法走mpp,性能也会下降
h5n1
(H5n1)
2
tidb_allow_mpp 这个参数值是啥? 空表测试是能走mpp
我这不行, 就算走mpp,tiflash也是转义成decimal啊,为什么bigint类型不是直接求和呢
感谢回答。
1、加了group by 确实会去走mpp
2、关于优化器问题, 有排查的建议吗
3、关于tiflash的类型推导,是不是为了兼容mysql,来确保行为一致。这边业务大量依赖tiflash,现在有很多的cast,导致优化的时候比较茫然(应该重新设计字段类型,还是显式的cast)。最好有文档能详细描述tikv和tiflash的差异。目前的文档还是不够详细。
关于优化器排查建议:我没有什么好的建议,不过如果你tidb版本新一点的话(好像是7.3之后),tidb 优化器默认只生成 mpp 的 plan 了,所以新版本里面应该没这个问题
关于tikv与tiflash差异:这个我理解需要 tidb 这边显示加 cast 的例子好像不是很多,我了解的大概就是下面几个
- 就你说的 sum(int),其实 sum(string) 应该也会有cast先把 string 转成 double
- int 类型的 join key 两边需要保持完全一致,比如 int = bigint 的话,下推给 tiflash 会把 int cast 成 bigint
- decimal 类型的 join key 两边需要保持精度在一定的范围内。因为 tiflash 的 decimal 实现内部映射为下面4种:
precision <= 9 : decimal32
precision <= 18: decimal64
precision <= 38: decimal128
precision <= 65: decimal256
如果精度差异过大,导致其映射的 tiflash 内部实现不一致的话,是会加 cast的,比如 decimal(10, 2) join decimal(8,2), 是会把 decimal(8,2) cast 成 decimal(10,2) 的
其他的感觉也不会加太多的cast。
或者你能举一个其他的典型例子么,我可以帮忙看看
你tidb版本新一点的话(好像是7.3之后
集群版本是7.5.4
其他的感觉也不会加太多的cast
查了一下,基本都是bigint 和varchar转义,典型的一时找不出。找到了再发帖吧。
再次感谢回复
嗯,是升级上来的。当时改这个是因为7.5 刚开始不稳定 mpp老崩。 后面我再验证下吧。
system
(system)
关闭
10
此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。