执行计划不准

【TiDB 版本】v4.0.9

【问题描述】在dashboard中查询慢sql,发现执行计划是走的tikv,并且时间很长。达到了5S.
执行计划如下:
SELECT
DISTINCT player_id
FROM
(
SELECT
player_id
FROM
ims_game_record04
WHERE
(
create_time >= ‘2021-04-29 16:44:00.0’
AND create_time < ‘2021-04-29 16:49:00.342’
AND flag = 1
AND update_time IS NULL
)
UNION
ALL
SELECT
player_id
FROM
ims_game_record04
WHERE
(
update_time >= ‘2021-04-29 16:44:00.0’
AND update_time < ‘2021-04-29 16:49:00.342’
AND flag = 1
AND update_time IS NOT NULL
)
) AS t;

但是在后台数据库查询的时候,很快,只有300ms,且执行计划其中第一个union走的是tiflash。。
执行计划如下:

查看表的健康度也只正常的,同时删除了表的统计信息,重新收集之后,还是无法改变dashboard的执行计划。
为啥dashbodrd没有走正确的执行计划?

语句上加上这句试试
/*+ read_from_storage(tiflash[使用TiFlash的表别名]) */

dashboard是程序连接的sql。加的只有改代码了。

可以尝试一下 sql binding https://docs.pingcap.com/zh/tidb/stable/sql-plan-management#执行计划绑定-sql-binding

没用的。是我后台sql执行计划和程序端连接的sql执行的计划不一样。

请问上面发送的链接 SPM 为什么没用,不需要程序端修改吧。

首先我在后台执行的sql,真实的执行计划就是走的tiflash,没有问题,绑定 hint也是可以的,也是走tiflash。但是程序端;连接的sql不会走,还是走的tikv。那就有个问题,为啥程序连接的sql没有走真实的执行计划。表的健康度是100%。表的统计信息也是对的。

  1. 看下程序段和你后台用的是不是一个 tidb-server ,如果不是可以看下是否程序段连接的 tidb-server 配置了参数只走了tikv
  2. 看下程序段连接的和后台的sql_mode ,其他变量是否都一致
  3. 找一个一模一样的sql试一下。
  4. 就算是找不到,我理解使用 SPM 也可以解决问题。

是的,不是一个tidb_server。在另一个tidb_server是正常的执行计划,很快,但是在这个tidb_server走的就是tikv,很慢

我在后台相同的tidb_server查询,是走的tikv,没有走tiflash。同一个sql在2个不同的tidb_server上执行的执行计划不一样,一个快走了tiflash,另一个慢走的tikv。即使用了/*+ read_from_storage(tiflash[ims_game_record04]) */,也是一样的。

在这个执行计划走 tikv 慢的 tidb server 上请做下下面的操作:

1、检查下这个表的统计信息健康度
2、如果允许,请收集下涉及到的目标表的统计信息

相关文档如下:

https://docs.pingcap.com/zh/tidb/v4.0/statistics#统计信息简介

1.查看了表的健康度是正常的。
2.统计信息我也重新收集了,但是还是不行,所以我把表的统计信息删除了,又重新收集了,但是还是一样的。
具体操作如下:
drop stats table_name;
analyze table table_name;
验证的结果还是一样。tidb_server.log (13.9 KB)

SHOW STATS_HEALTHY 涉及到的表的健康度信息都拿下看下

https://docs.pingcap.com/zh/tidb/stable/statistics#表的健康度信息

±------------±------------------±---------------±--------+
| Db_name | Table_name | Partition_name | Healthy |
±------------±------------------±---------------±--------+
| gps_a54_546 | gps_ghg_record04 | | 99 |
±------------±------------------±---------------±--------+
就这一个表

配置查了吗? 是不是估计这样的,配置了参数,只走 tikv 。 业务上人为区分 tp 和 ap

没有配置,是默认的。
业务上都是统一的一个负载均衡的ip,均衡到其他节点的。默认是自动评估走哪个的

请问 SPM 尝试过了吗?如果 SPM 已经 binding ,那么在 SPM 的系统表会记录这个 hint ,重启或者长时间就不会出现走到 TIKV 引擎上面,可以实现试一下哈

UNION ALL像这样的,只能单个binding。我之前已经试过,但是不行,我稍后再试下吧。不知道和我开启了自动绑定有关。我现在把tidb_evolve_plan_baselines这个关了。稍后再观察下

https://docs.pingcap.com/zh/tidb/stable/sql-plan-management#查看绑定
通过这个 show bindings 语句能查看到您绑定的语句吗?
麻烦您这面贴一下执行的结果。