执行计划有错误

报错信息build global-level stats failed。

fail to get stats version

5分钟一次,analyze时间长

我是感觉真的需要重视起来了,不能当作偶然了。
单个看都有偶然性,不过在统计信息这个点上,问题是连续出现的。

确实,尤其分区表的ddl很容易产生统计问题

我是感觉,应该尝试找找日志有没有统计信息相关的报错。
发现是统计信息的问题,然后删掉统计信息,再重建,这个有点被动。

再不行,有任何主动检测的办法也可以接受。

表有没有做过最新统计分析,健康度如何

重新收集后的统计信息也导出一份吧

一次性写入的历史数据不会变化的,索引后加的

新的
win_ticket1.json (1.1 MB)

经过测试应该基本找到原因了, 重新收集前stats_histograms里没有ind_paid_time索引的信息,因此测试删除ind_paid_time索引在stats_histograms里的信息后重启tidb server释放stats cache 就变成全表扫描了。

不过做反向测试吧删除的数据重新插回后仍然是全表扫描 且stats cache加载的统计信息都变成了0,看来生产是不能这么玩。

结论: 你导入的历史数据统计信息里,没有后加索引的统计信息,导致没用上索引,因此需要建索引后手动收集统计信息或tidb自动触发后台收集。

问题: 看前面测试 tidb对执行计划的选择上还是有些问题,即便是没有了stats_histograms里的索引信息,但通过stats_histograms里索引列的distinct_count 或者 stats_buckets中 SQL条件所落入的buckets范围判断,都不应该选择全表扫描。现在测试推断stats_histograms里所用的信息是个必选条件,没有就不再判断其他的了,不合理。

1 个赞

问了下官方 加索引后自动收集统计信息正在搞,期待后续版本吧

也就是现在加了索引必须手工收集统计信息才能生效对吧

嗯 如果达不到触发表自动统计信息收集就得这样

后续测试又发现了些东西,在7.5版本后建完索引会有一个小采用率的统计信息收集(测试了2个表分别在fast_reorg 打开和关闭情况下)

7.1.2版本建完索引后不会自动收集统计信息, 虽然stats_histograms没有索引信息,但能走索引

如果是换成一段范围的条件就走不了索引。

之前我们人带人的时候告诉我们倒入数据后得analyze table 一下 pg 和mysql都是这样 期待下个版本 现在手动一下

倒入数据后analyze table 在tidb上一般不用,健康度低了自动analyze

我理解加索引属于数据字典变更,不属于表的统计信息,加索引应该是重大变更,优化器应该自动识别才是对的,不管数据量多少

执行 DDL 之后未及时更新统计信息有个 issue 跟踪: https://github.com/pingcap/tidb/issues/41448

这里的伪统计信息具体包含哪些内容?

统计信息未及时更新

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