大家遇到过同一个Tidb集群中,不同的tidb-server,执行同一条sql语句,执行计划不一样

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

大家遇到过同一个Tidb集群中,不同的tidb-server,执行同一条sql语句,执行计划不一样

能贴下两个执行计划吗?是分别走到tikv和tiflash了吗?

马上贴出执行计划

1.通过navicat客户端连接10.3.72.95的tidb-server,执行查看相同Sql的执行计划,如下:

2.通过navicat客户端连接10.3.72.94的tidb-server,执行查看相同Sql的执行计划,如下:

show config like ‘%engine%’;
看下两个tidb-server的配置是不是不一样啊,一个配了tiflash,一个没配?

1 个赞


配置一样

show variables like ‘%tidb_isolation_read_engines%’;
看下

1 个赞

那这个也看下

1、重启下试试
2、 可以通过information_schema.cluster_config对比下参数差异
3、去每个tidb 查询variables_info 对比差异

集群没升级过吧

没升级过,直接安装的v6.5.0版本

已经结案了,我在10.3.72.95的tidb-server上,把5张表都执行了下:

        ANALYZE table es_charge_incoming_fee;
	ANALYZE table es_charge_incoming_data;
	ANALYZE table es_charge_voucher_project_set;
	ANALYZE table es_charge_pay_mode;
	ANALYZE table es_info_object_and_owner;

执行完成后,再查看2个tidb-server,这次,执行计划一样了。

服务部署资源不一样吧,看两个tidb上加载的表分析健康状态

也就是说不同tidb server的统计信息缓存有差别

统计信息难道是不是存在pd上的,对两个tidb还有区别?
只能怀疑是本来表的统计信息就过期了,然后tidb执行sql用了伪随机数收集了统计信息,然后两个tidb随机出的不一样

统计信息region信息等pd存,但是tidb也得缓存这些数据,否则效率太低了

应该有执行计划缓存吧 类似于Oracle硬解析软件解析 如果统计信息各个节点都需要缓存 那面对一个负载高更新频繁节点多的数据库 这个缓存的更新机制就不太好设计了

执行计划是依赖统计信息的 统计信息不准执行计划就会变

就很奇怪

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。