怎么预估收集统计信息所需时间?

请问该怎么去计算一张表收集统计信息所需要的时间?

一直以来都是表规模+平时维护周期等因素来预估

:thinking:我们一般就是看表数据量,然后根据经验估算。但实际还是受硬件环境,执行时集群负载情况的影响。

一般应该跟表的字段、索引数量、数据量有关系吧。

以前在oracle中,我一般是根据表数量预估,查询统计信息表(视图)中的更新时间在开始执行统计信息收集之后的占比。
当然还可以根据数据量进行预估,就是把上面查到的表,在拿去统计所占的数据量。
我想tidb应该也可以用这样的思路去预估。

1 个赞

嗯嗯 我统计一下看能不能搞出一个大概的公式吧

类似 select * , 新版本会跳过一些如 text 字段

mark一下等其他回答

没有预估目前

我一般是根据show analyze status里的开始时间和已完成行数,结合表的总行数,按比例推算需要的时间

感觉可以看一下自动收集的时间,做个参考。

在观察一下

我找个环境去测试一下,应该可以搞出一个大概的公式。

大概率要考虑资源的可用性,还有数据结构和数据大小

是的,从字段类型,字段数,索引数,数据量这几个方面考虑测试

目前应该是没法量化预估的。首先统计信息作业需要排队呀,什么时候排到这个作业不知道。其次,考虑作业开始后,统计的时间依赖于表结构(表的字段数,字段类型),还有行数,还有索引数量,还有TIKV数量,还有网络情况,还有TIKV的配置。。。影响因素太多。
当然,自己的系统,做多几次还是有迹可循。

在TiDB中,计算一张表收集统计信息所需的时间涉及到多个因素,包括表的大小、数据分布、硬件性能、系统负载等。TiDB提供了ANALYZE TABLE语句来手动收集统计信息,但这个过程通常比MySQL或InnoDB中的统计信息收集耗时更长,因为TiDB会完全重构一系列统计信息

感觉这得靠经验,根据数据量,字段,索引数量等这些指标来预估了

主要是受数据量和硬件设施

在 TiDB 中,预估统计信息收集时间并没有一个直接的方法,因为统计信息的收集是一个自动和持续的过程,与表的大小、数据变更频率以及系统的工作负载有关。但是,可以通过一些步骤和参数来间接预估和调整统计信息收集的时间。

  1. 查看表的健康度:TiDB 会根据数据变更的行数与总行数的比例来评估统计信息的健康度。健康度小于一定比例时,TiDB 会开始自动收集统计信息。可以通过 SHOW STATS_HEALTHY 语句来查看表的健康度 12。
  2. 自动更新统计信息:TiDB 可以在数据变更后自动更新统计信息。这可以通过设置 tidb_auto_analyze_ratio 来控制,当变更行数占总行数的比例超过这个阈值时,自动触发统计信息的更新 12。
  3. 手动收集统计信息:通过 ANALYZE TABLE 语句可以手动触发统计信息的收集。收集统计信息的时间取决于表的大小和系统的负载。
  4. 监控统计信息收集状态:使用 SHOW ANALYZE STATUS 可以查看当前统计信息收集的状态,包括已处理的行数、开始时间和结束时间,从而可以预估收集时间 12。
  5. 调整统计信息收集相关参数:通过设置 tidb_build_stats_concurrencytidb_distsql_scan_concurrency 等参数,可以调整统计信息收集的并行度,进而影响收集时间 12。
  6. 关注版本特性:在某些版本中,如 tidb_analyze_version=2 时,可能会因为未关闭的 channel 导致内存增长或 OOM 问题,这可能间接影响统计信息收集的时间和效率 14。
  7. 处理特殊情况:如果遇到统计信息收集失败的情况,如因表中存在非法字符导致 encoding failed 错误,需要定位具体异常数据范围并进行处理,这会影响统计信息收集的时间