多表关联 并有多表并行查询 union / distinct 查询不能下推到存储节点执行,db压力过大 查询失败数据量亿别

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】tiflash 副本2个 有创建索引
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
demo sql.sql (30.1 KB)

按照union 拆分分段分析吧 看看是哪一段慢

单取一段出来,都挺快的. 因为我们会员基数比较大. 从tiflash 取到数据给db计算,这个过程就给db很大压力. db的计算好像是单节点的.

不想看这SQL :joy_cat:

那试试MPP模式呢

1 个赞

:joy: 我们自己都懒得看… 太要命了

你要是运维就给开发看吧 :joy_cat:,你要是研发就重新开发吧 :joy_cat:

1 个赞

:grin: 这玩意儿是程序拼接出来的脚本! 只能给后端同学了

谁写的谁优化啊

1 个赞

要不直接explain analyze一下看看?不过属实建议重写这个sql

1 个赞

执行计划也没有

explain输出执行计划看看。

建议重写sql吧。。。

确实要重写。 太臃肿 :joy:

执行计划 大部分计算在db端处理。 数据量本身就大 就会比较慢,甚至超时

把涉及的表都加进tiflash里面去,然后强制mpp试一下看看。

最好是能提供你现在的执行计划。

强制mpp 也只能作用在每个子查询read数据的时候才用到tiflash 外层的去重还是要在tidb上运行

不会的,这种情况有几个可能:

1,你有些表没有tiflash副本。
2,sql中有些算子不支持下推,或者有人设置的下推的黑名单,这个算子在黑名单里。
3,有些小表,通常是维度表,被设置了缓存表。

除上述情况以外可以做到tiflash直接算出来,tidb直接拿结算结果。

我看了你的sql,好多都是同一个表不同条件,反复union。外加一些关联。正常情况应该是可以从tiflash直接算出来的。

这是我的测试结果。


我强制mpp怎么执行计划是这样的?