分区的表的analyze非常慢,能不能优化下

如果用了分区表,tidb会把每个分区作为一个独立的表进行analyze。问题是每个分区的analyze特别慢如图

上面的例子共有5个步骤:
auto analyze table all columns with 256 buckets, 500 topn, 1 samplerate
merge global stats for z_qianyi.win_ticket’s index ind_win_time
merge global stats for z_qianyi.win_ticket’s index ind_paid_time
merge global stats for z_qianyi.win_ticket’s index primary
merge global stats for z_qianyi.win_ticket columns

最后这个非常非常慢,这个分区也就4万条数据。看看能不能优化下

1 个赞

讲实话,tidb对分区表支持的不是特别好,你试一下针对单个分区进行analyze看一下慢不慢

非常非常慢,和自动分析一样,分区多了这么分析还不如直接analyze 全表

比如手工测试ANALYZE table z_qianyi.win_ticket PARTITION P359025;
执行了760秒

这个分区总共16万条数据,全表扫描也就几秒的事。
win_ticket表共690个分区

开始始间和结束时间 截图分享下

也有失败的

我们实际使用也这样,感觉ANALYZE 比较慢

可以调整并发参数试试,这样能加快

有个疑问,tidb已经是分布式的了,还有必要做分区表吗?

tidb分区表就一个地方用,删除大量数据

分区表参数tidb_auto_analyze_partition_batch_size我试试1调整到100

分区表删数据方便,为了这个功能

我这边也很慢,不知道怎么回事

刚才测试了tidb_auto_analyze_partition_batch_size改大应该有明显效果,我直接1改成100了。

根据分析,分区表的分区analyze,对分区做统计是很快的,比如我们数据量小,几秒就完事了,慢在merge global stats for test_vegas2.ticket columns 这步骤上了,多个分区可以公用这个步骤,所以改大效果很好,前提是分区数据量小

1 个赞

https://github.com/pingcap/tidb/issues/47275
这块在7.4版本后开启了一系列优化。

https://github.com/pingcap/tidb/issues/50030
merge global stats 7.6可以异步执行。
以前是要把所有分区统计完才能合并,现在可以边统计边合并。

merge global stats 这个步骤执行慢不说,一般都是结果fail

tidb对分区支持性不是很好

单个分区弄吧,如果还是慢那就没招了。

tidb_merge_partition_stats_concurrency我看有这个参数,可以增加merge并行度

1 个赞

现在还有个问题就是merge那一步总是报错

最后说下研究的结果:

慢的原因是7.5.0版本等有BUG,在merge global stats那一步不但慢,大概率还会failed报错"illegal bucket order"
该报错在7.6.0更新说明所提示修复: * 修复并发合并分区表的全局统计信息时可能遇到报错的问题 #48713 @hawkingrei

经过部署7.6.0版本测试,7.6.0版本merge global stats不会报错,而且速度快了十几倍

1 个赞