V6.5.5和V7.5.1多表join执行计划不一样

【 TiDB 使用环境】生产环境 /测试
【 TiDB 版本】生产环境V6.5.5 测试环境V7.5.1
【复现路径】在测试库上恢复生产库同样的数据量
【遇到的问题:问题现象及影响】多表join时,V7.5.1执行SQL耗时 0.1秒,V6.5.5执行SQL耗时4秒。通过explain查看,V7.5.1只需要扫描一张的数据量,V6.5.5需要扫描所有join表的数据量,这是什么原因?
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】


应该是优化器改进,sql是个聚合,wd left join其他表 而其他表又没条件,count(*)就相当于只查wd符合条件的记录了

我猜表结构不一样 :smiley_cat:
7 版本那边都有主键或唯一键

从br恢复的原表结构,原数据

也是,从 v6.5 的执行计划中看到了走了主键

我记得这个逻辑优化 join eliminate 应该早就实现了,不应该做不到啊

https://github.com/pingcap/tidb/pull/8021
确实有这种消除优化 ,不过看时间是2018年

有啥参数可以看到吗?我看一下

有具体参数可以查看一下吗

没啥参数控制,你就拿 6.5.11 测试下吧,测试下你原 SQL ,再测试下 join 一个情况,可能是 bug

原SQL就是这样的,count的时候,就会把其它join的表数据全扫一遍。

这个网站打不开。。。

换 TiDB v6.5.11 版本测试下

呃,我这2套环境,都在用。现在不能换。后面也是计划升到V7.5.x的

重新收集一下统计信息试试看。

1 个赞

不一样先把涉及的表手工analyze

br恢复之后 ,都会手动analyze

如果是测试,可以考虑把统计信息也导出导入,再测试

备份统计信息

从 TiDB v7.5.0 开始,br 命令行工具引入参数 --ignore-stats。当指定该参数值为 false 时,br 命令行工具支持备份数据库的列、索引、和表级别的统计信息,因此从备份中恢复的 TiDB 数据库不再需要手动运行统计信息收集任务,也无需等待自动收集任务的完成,从而简化了数据库维护工作,并提升了查询性能。

当未指定该参数值为 false 时,br 命令行工具默认 --ignore-stats=true,即在备份数据时不备份统计信息。

下面是备份集群快照数据并备份表统计信息的示例,需要设置 --ignore-stats=false

tiup br backup full \
--storage local:///br_data/ --pd "${PD_IP}:2379" --log-file restore.log \
--ignore-stats=false

完成上述配置后,在恢复数据时,如果备份中包含了统计信息,br 命令行工具在恢复数据时会自动恢复备份的统计信息(从 v8.0.0 起,br 命令行工具新增 --load-stats 参数来控制是否恢复备份的统计信息,默认恢复,一般情况下无需关闭):

tiup br restore full \
--storage local:///br_data/ --pd "${PD_IP}:2379" --log-file restore.log

备份恢复功能在备份时,将统计信息通过 JSON 格式存储在 backupmeta 文件中。在恢复时,将 JSON 格式的统计信息导入到集群中。详情请参考 LOAD STATS