tidb4.08 同样的sql 不同的环境,执行时间差异很大

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【TiDB 版本】生产、测试都是4.08

【问题描述】
问题语句:
SELECT count(*) FROM cj_user_prize_log l INNER JOIN user_db.user u on l.userId=u.id where l.id>0\G;

在生产环境执行结果:

在测试环境执行结果:

导致这个问题的原因是生产环境的表有统计信息,测试环境没有,下面是生产环境表的统计信息:

这个语句有没有优化解决的方法

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

  1. 请问测试环境和生产环境的数据量一致吗?
  2. 生产环境使用 sql hint 强制走 index join 的执行计划看一下,如果index join 时间短,可以绑定执行计划。

数据量查不多,如何强制走index join

请参考文档 https://docs.pingcap.com/zh/tidb/stable/optimizer-hints#optimizer-hints


这样执行更慢了

  1. 麻烦写成,INL_JOIN(u,l) 试试。
  2. 麻烦将修改后的执行计划和测试环境的执行计划都返回下完整的文本信息吧,多谢。

正式环境:

测试环境:


执行时间很长, 比不加 INL_JOIN 还慢

测试环境和生产环境的网络带宽等资源是否一致 ? 目前 SQL 优化器会有一层是 成本优化,不同环境可能会有不同的执行计划,可以看一下这块的可能出现的情况,是否和你遇到的有相似性。
https://docs.pingcap.com/zh/tidb/stable/wrong-index-solution

看起来只有一个表被 analyze 了
可以看一下加了 hint 之后的 explain 吧
测试环境也可以先把两个表都analyze 了看看