咨询一个事情。我们有个表太大了

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】
比如这个表有1000g。因为磁盘性能差。统计信息一次更新需要20小时。这个时候有什么办法加快统计信息更新。各位大佬有好办法么。
或者锁定统计信息?

锁定表或分区的统计信息:

https://docs.pingcap.com/zh/tidb/v8.2/sql-statement-lock-stats#lock-stats

1 个赞

控制 ANALYZE 并发度

执行 ANALYZE 语句的时候,你可以通过一些系统变量来调整并发度,以控制对系统的影响。

相关系统变量的关系如下图所示:

tidb_build_stats_concurrencytidb_build_sampling_stats_concurrencytidb_analyze_partition_concurrency 为上下游关系。实际的总并发为:tidb_build_stats_concurrency* (tidb_build_sampling_stats_concurrency + tidb_analyze_partition_concurrency) 。所以在变更这些参数的时候,需要同时考虑这三个参数的值。建议按 tidb_analyze_partition_concurrencytidb_build_sampling_stats_concurrencytidb_build_stats_concurrency 的顺序逐个调节,并观察对系统的影响。这三个参数的值越大,对系统的资源开销就越大。

tidb_build_stats_concurrency

ANALYZE 在执行时会被切分成一个个小任务,每个任务只负责某一个列或者索引的统计信息收集。tidb_build_stats_concurrency 用于控制可以同时执行的小任务的数量,其默认值是 2。TiDB v7.4.0 及其之前版本默认值为 4

tidb_build_sampling_stats_concurrency

在执行 ANALYZE 普通列任务的时候,tidb_build_sampling_stats_concurrency 可以用于控制执行采样任务的并发数量,其默认值是 2

tidb_analyze_partition_concurrency

在执行 ANALYZE 的时候,tidb_analyze_partition_concurrency 可以用于控制对分区表统计信息进行读写的并发度,其默认值是 2。TiDB v7.4.0 及其之前版本默认值为 1

tidb_distsql_scan_concurrency

在执行分析普通列任务的时候,tidb_distsql_scan_concurrency 可以用于控制一次读取的 Region 数量,其默认值是 15。修改该变量值会影响查询性能,请谨慎调整。

tidb_index_serial_scan_concurrency

在执行分析索引列任务的时候,tidb_index_serial_scan_concurrency 可以用于控制一次读取的 Region 数量,其默认值是 1。修改该变量值会影响查询性能,请谨慎调整。

更新统计信息消耗过多的资源,可以通过系统变量 tidb_enable_auto_analyze关闭自动更新。
特别大的表,也可以按照比例收集信息。例如WITH 0.1 SAMPLERATE只收集10%的数据。
另外建议修改analyze的并发度,可以适当调大

1 个赞

锁定表 那统计信息不更新了。表还有业务查询。查询会变慢。

这个有详细教程么

加并发搞

如果sql较少,可以考虑绑定执行计划,把统计信息自动收集关掉。

https://docs.pingcap.com/zh/tidb/v8.2/statistics
好像只能手动,后面的判断,执行等可能都要手动控制了

一般都是调参加并发搞

### 手动收集

1 个赞

调参数吧

调整下统计信息并发参数

有个统计信息持久化,可以修改下统计信息的默认执行参数,可以加上with参数

这个只能加并行

磁盘差

根在磁盘上,得解决磁盘的问题。

完全可以锁定统计信息

对了,还有可以调整并发和采样率来加快收集