analyze table 之后,统计信息还是会有不准的情况

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】5.4.3
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
用的最多的tidb版本就是5.*的,我记得在很多次sql调优过程中都碰到过有的表统计信息收集完成之后,执行sql统计信息还不不准的情况,导致执行计划不准确。

举例:今天碰到的一个子连接全表1400W数据,需要400w数据,结果因为统计信息(刚手动收集过)不准,选择了走索引回表,更慢,这个地方应该全表扫更好,ignore index 之后解决了。
image
image

这种有部分表收集完统计信息之后,执行计划还是不准的情况,大家有碰到过吗?
找了一下也没找到过这个问题的issue,在记忆中出现过很多次
【资源配置】
【附件:截图/日志/监控】

prepare_plan_cache 开了吗? 把这个关掉试一下。

看了一下,
没开

SHOW stats_histograms WHERE table_name=‘t1’;
看一下表的统计信息到底是什么情况

直方图信息收集了吗?

我直接用的analyze table t1这种哦,理论上是全部都收集

plan replayer dump explain analyze select xxxx; 导出下信息

https://docs.pingcap.com/zh/tidb/stable/sql-plan-replayer#plan-replayer-导出示例

replayer_single_Sa3L2SH9CrYmcuscY9E3MQ==_1677725054367414336.zip|attachment (579.4 KB)

你这库是啥版本,我用6.1.1导入

5.4.3

当前是5.4.3版本,但是我再其他5的版本上也遇到过这种问题

表结构能发一下吗?你这表到底有几个索引?都在哪个字段上?

有点不太理解,表结构和统计信息这个无关吧

show stats_buckets 是列的直方图信息,要是没有显示就把列作为where条件执行个SQL 然后再看看 你的条件和buckets落的范围



统计信息查询出来是没有问题的

感觉 是直接按 row_count / distinct_count 预估的

我不理解,为啥stats_hitograms里面没有do_id的信息?

:joy: :joy: :joy:,这有点离谱,不能说等于这是数就是这么算,我怀疑是统计信息还是收集了,也更新了对应视图信息,但是异步加载到tidb缓存中做更新,可能因为某些参数的限制导致有一小部分的表的统计信息更新不了

你是说column name 那一列吗