同一SQL,不同tidb实例 结果不一致(执行计划也不一致)

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.1.2
【遇到的问题:问题现象及影响】
同一个SQL不同tidb实例 结果不一致
SQL语句

SELECT
	a.*
FROM
	(
		SELECT
			a.*, ROUND(a.stat_cost * 100 / b.cost, 2) cost_rate,
			a.stat_cost cost,
			ROUND(a.ad_created * 100 / b.ad_created, 2) ad_created_rate,
			ROUND(a.valid_ads * 100 / b.valid_ads, 2) valid_ads_rate,
			ROUND(a.operates * 100 / b.operates, 2) operates_rate
		FROM
			(
				SELECT
					a.*,@rowNum :=@rowNum + 1 AS num
				FROM
					(
						SELECT
							operator,
							operator_name,
							ROUND(SUM(cost) / 1000000, 2) stat_cost,
							ROUND(SUM(goal_cost) / 1000000, 2) goal_cost,
							SUM(ad_created) ad_created,
							SUM(valid_ads) valid_ads,
							SUM(operates) operates,
							pdei.position,
							a.dept_id,
							a.dept_name,
							pdui.avatar,
							CASE
						WHEN pdui.position LIKE '经理' THEN
							operator_name
						ELSE
							''
						END manager
						FROM
							account_board_stat_daily_copy a
						LEFT JOIN pig_dd_employee_info pdei ON a.operator = pdei.user_id
						LEFT JOIN mbg_core.pig_dd_user_info pdui ON a.operator = pdui.userid
						WHERE
							stat_date BETWEEN '2023-02-27'
					AND '2023-03-04' 
						AND operator > 1000
						AND operate_type IN (0, 3)
						GROUP BY
							operator
						ORDER BY
							stat_cost ASC
					) a,
					(SELECT @rowNum := 0) b
			) a
		LEFT JOIN (
			SELECT
				a.*
			FROM
				(
					SELECT
						operator,
						operator_name,
						ROUND(SUM(cost) / 1000000, 2) cost,
						ROUND(SUM(goal_cost) / 1000000, 2) goal_cost,
						SUM(ad_created) ad_created,
						SUM(valid_ads) valid_ads,
						SUM(operates) operates,
						pdei.position,
						a.dept_id,
						a.dept_name,
						pdui.avatar
					FROM
						account_board_stat_daily_copy a
					LEFT JOIN pig_dd_employee_info pdei ON a.operator = pdei.user_id
					LEFT JOIN mbg_core.pig_dd_user_info pdui ON a.operator = pdui.userid
					WHERE
						stat_date BETWEEN '2023-02-20'
					AND '2023-02-26'
					AND operator > 0
					AND operate_type IN (0, 3)
					GROUP BY
						operator
					ORDER BY
						cost
				) a
		) b ON a.operator = b.operator
	) a
WHERE
	1 = 1
ORDER BY
	a.num ASC
LIMIT 0,
 100

不正常的结果:
健康度
image
执行计划

正常结果的tidb实例
健康度


执行计划

这个版本是升级上来的?

从5 升级的,升完级之后 就把所有表的执行计划 重跑了。 升级到现在都5个月了,

tiup cluster display 看下版本,然后再2个实例的mysql连接提示信息和select version()看下版本一致吗

dashboard 上显示的所有组件版本都一致么

k8s安装,tidb 配置版本都一致

再检查下2个tidb的镜像看看

不一致的结果是随机的 还是指定的tidb 实例

指定的tidb实例

把错误的下线后重新上线试试呐

plan cache ?

执行结果不固定,一般看 SQL 结果是否会受到只查询的结果顺序影响或者 整个分页的排序字段是否够全且不重复。

不同节点执行计划不同,试试:

  1. 手动收集下相关表的统计信息
  2. 重启下 tidb-server,刷掉内存缓存的表信息。
1 个赞

重新跑执行计划不生效,重启异常tidb-server 恢复了。
这种应该怎么避免? 难道定期重启tidb server?

试试升级一下,感觉是 tidb 的表信息没有更新 类似这种 :thinking:,一般很少见的

统计信息不在内存中吧,或者是异步加载的问题。

1 个赞

感觉还是这个有问题的pod升级过程不完全

总共13个tidb 实例,现在发现有多个实例异常。和升级不完全没关系

集群tidb 实例挨个重启, 还是出现结果不对的情况
根据cost排序,结果不对
image

tidbserver的统计信息不对,可以在各个tidbserver节点执行analyze table 重新统计信息试试