执行计划显示走的tiflash,执行时,监控上tidb内存增大,tiflash不变,为什么?

【 TiDB 使用环境】生产环
【 TiDB 版本】
【复现路径】
explain 执行计划显示走的tiflash,执行时,监控上tidb内存增大,tiflash不变,为什么?

SELECT /*+ max_execution_time(600000) ,READ_FROM_STORAGE(TIFLASH[`a`])*/ `a`.`CH_DEAL_ID`,DATE_FORMAT(`D_FINISHED_TIME`, '%Y-%m') AS `month_date`,`CH_ID_CARD_UC_ENCRYPT`,SUM(`I_AMOUNT`) OVER (PARTITION BY `CH_DEAL_ID`, DATE_FORMAT(`D_FINISHED_TIME`, '%Y-%m'), `CH_ID_CARD_UC_ENCRYPT`) FROM `stat`.`dwd_detail_si` AS `a` WHERE `I_STATUS` = 1 AND `I_USER_PAID_AGE` != -1 AND `D_FINISHED_TIME` >= '2024-01-01' LIMIT 100

执行计划

【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

可能是由于 TiDB 在处理查询过程中需要维护一些中间状态或结果集,而 TiFlash 的内存没有变化是因为 TiFlash 不直接参与这部分数据处理。

第三行算子在 tidb 跑,没下推 tiflash, 你可以简单把 sum 改 FIRST_VALUE 试试算子有没有下推 tiflash
https://docs.pingcap.com/zh/tidb/stable/window-functions

第1至第5行得执行计划root表示该层算子会在tidb server层执行,完成相关的数据读取和计算操作,从预估的行数可以看到有接近2千9百万行的数据拉到TiDB server 的内存里,这肯定会引起内存使用增加。

建议优化一下SQL,不然使用太多内存容易导致oom 发生。

:thinking:只有底层读取数据是在tiflash执行的,读取之后的聚合是在tidb层执行的,也就是各个节点返回的数据越多,tidb层资源消耗越大。

你有几个tiflash节点?应该是用了tiflash的mpp导致你的limit无法下推到所有的tiflash节点,你执行set @@session.tidb_allow_mpp=0;之后再看下这个sql的执行计划,看看limit是否能够下推到某一个tiflash节点

  • Window:当前支持下推的窗口函数包括 ROW_NUMBER()RANK()DENSE_RANK()LEAD()LAG()FIRST_VALUE()LAST_VALUE()

不支持sum 窗口函数下推tiflash。所以需要再tidb读取大量数据计算

不支持sum,怎么改进呢,有啥优化办法吗

汇聚还是在tidb上面

支持sum作为单独聚合函数下推,至于窗口函数的得看官方吧。 你这SQL是不是可以直接sum .group by

直接sum .group by,那样不知道为啥,tiflash内存直接打满,150G,感觉有点扯

表多大的数据量

17亿

你有几个tiflash节点

两个节点

可以升级到7.1.5版本试试sum…group by,有个tiflash 内存泄露的修复

有链接吗?升级的链接

https://docs.pingcap.com/zh/tidb/stable/upgrade-tidb-using-tiup 先在测试环境搞