v7.5.4 tiflash 会把bigint类型转换成decimal,是否符合预期

【 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,性能也会下降

tidb_allow_mpp 这个参数值是啥? 空表测试是能走mpp


我这不行, 就算走mpp,tiflash也是转义成decimal啊,为什么bigint类型不是直接求和呢

  1. 为什么bigint类型不是直接求和:
    这个主要是因为 tiflash 里面,sum(int) 结果是 bigint,sum(decimal) 结果是 decimal,而 mysql/tidb 里面 sum(int) 结果是 decimal,为了保持与 mysql/tidb 的兼容性,所以加了这个 cast,理论上改造下 tiflash 里面的 sum 实现,让它类型推导的时候也返回 decimal 的话,就不用加这个 cast了,而且确实会提升一些性能。不过这个优化一直没做
  2. tiflash这么处理导致没法走mpp
    这个应该不会,加这个 cast 不会导致走不了 mpp,你这边估计是优化器有点问题。不过具体到你这个 query 用不用mpp应该效率都差不多。你可以试试带 group by 的 query,应该能走 mpp 的

感谢回答。
1、加了group by 确实会去走mpp


2、关于优化器问题, 有排查的建议吗
3、关于tiflash的类型推导,是不是为了兼容mysql,来确保行为一致。这边业务大量依赖tiflash,现在有很多的cast,导致优化的时候比较茫然(应该重新设计字段类型,还是显式的cast)。最好有文档能详细描述tikv和tiflash的差异。目前的文档还是不够详细。

关于优化器排查建议:我没有什么好的建议,不过如果你tidb版本新一点的话(好像是7.3之后),tidb 优化器默认只生成 mpp 的 plan 了,所以新版本里面应该没这个问题
关于tikv与tiflash差异:这个我理解需要 tidb 这边显示加 cast 的例子好像不是很多,我了解的大概就是下面几个

  1. 就你说的 sum(int),其实 sum(string) 应该也会有cast先把 string 转成 double
  2. int 类型的 join key 两边需要保持完全一致,比如 int = bigint 的话,下推给 tiflash 会把 int cast 成 bigint
  3. 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
image

其他的感觉也不会加太多的cast

查了一下,基本都是bigint 和varchar转义,典型的一时找不出。找到了再发帖吧。
再次感谢回复

那我估计是你升级上来的吧,你可以看看这个参数的取值:
https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_allow_tiflash_cop-从-v730-版本开始引入

image
嗯,是升级上来的。当时改这个是因为7.5 刚开始不稳定 mpp老崩。 后面我再验证下吧。

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。