多一行if就会影响100多秒性能

【 TiDB 使用环境】生产环境
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】


workflow.sql (19.7 KB)
去掉if执行计划.xlsx (18.5 KB)
为去掉执行计划.xlsx (18.4 KB)


表象上加了if一行就会走磁盘

计算得移出sql 你这个sql是每行计算 都砸在tidb了

要怎么改这个sql?

没有中间层,可以帮你做这些计算么,还是场景上必须用 SQL 来实现?

必须用sql,这个还好吧

对比俩执行计划,好像是因为排序刷盘导致变慢的

if为啥走排序算法啊,搞不懂啊

提前把if条件计算出来。

怎么提前?

能简单举个例子吗?

建个虚拟列 把总计时常 应出假期 改成虚拟列 提前算好

简单举个例子啊,有点不懂,大佬

去掉后

└─Sort_132	390.23	410417	root		time:36.3s, loops:402	heytea.orgstdstruct.unitcode, heytea.rbsj.gh, heytea.rbsj.sjrq	409.6 MB	0 Bytes

没去掉

└─Sort_132	390.23	410417	root		time:2m29s, loops:402	heytea.orgstdstruct.unitcode, heytea.rbsj.gh, heytea.rbsj.sjrq	410.2 MB	466.9 MB

没去掉的时候,sort落盘了。 disk 大小是 466.9 MB

翻了下,使用一旦sort算子落盘,会使用外排序。
然后从当时的pr提交的性能报告来看,确实会造成比较大的性能回退。大概回退4-12倍。
https://github.com/pingcap/tidb/pull/14279

另外,我还是觉得你这个sql应该跑在tiflash上。

加了,但是跑不上去啊,要怎么办?

https://docs.pingcap.com/zh/tidb/v6.5/sql-plan-replayer#使用-plan-replayer-导出集群信息

如果方便的话,可以保存一份现场执行信息,我在我自己的集群上调调看。这个里面包含一些集群的参数,表结构,和统计信息。zip你自己也可以打开看看,感觉不合适的内容你可以删掉。

如果不方便就算了。
重点检查mpp开了没开(没有mpp不能下推hashjoin到tiflash执行),是否有某些表在查询中但没有tiflash副本。

我这边不方便下载

好的。对着mpp的文档仔细看看吧。

其实不因该很复杂,正常查询sql内所有的表都有tiflash副本,外加会话级设置一下,强制mpp。就能应该能看到一部分是走mpp的。

你这个执行计划是基本没有tiflash的部分在里面。我感觉还是这两个条件有哪一个没有满足。这个应该不难找的。

没有走tifalsh证明系统判断tiflash也没用,我是这么理解的,我感觉这个问题不一定在tifalsh

你这个sql是把几个最多2000w左右的表聚合到1.4w行上去。就是tiflash+mpp的适合的场景。

优化器到底是没有这么选,还是有什么设置所以不能这么做。我不清楚。

要不 tidb_enforce_mpp 强制 mpp 试试

1 个赞