大表做执行analyze table需要多长时间?

【 TiDB 使用环境`】生产环境

【 TiDB 版本】TiDB 5.1.0

【遇到的问题】目前生产环境有2张大表,数据量:表一数据量46亿,占用空间大小1.25TB,表二数据量460亿,占用空间大小5.91TB,现在想使用analyze table对这二张表做分析,具体需要多长时间?有没有哪位大师有实际操作案例经验供分享一样,我好申请操作时间?

在tidb中执行analyze会不会锁表?以下是我从百度搜索到的,但是TiDB应该有区别?
https://blog.csdn.net/weixin_50518271/article/details/109498885
在对表的键分布进行分析时,ANALYZE TABLE操作会将指定的表从表定义缓存中移除,并且会对于InnoDB、MyISAM表会加上读锁,即其他会话只能对表数据进行查询,无法对表数据进行修改,直到执行分析的会话释放了锁。

不锁表,相较与mysql可能会消耗较多的时间和资源,建议业务低风期操作

1 个赞

tidb是无锁读,集群资源不同,分析时间也有差异,主要是IO,有可能会因为分析时间超过GC safepoint导致分析失败,有几个参数可以调整加快分析速度,。

tidb_build_stats_concurrency

目前 ANALYZE 执行的时候会被切分成一个个小的任务,每个任务只负责某一个列或者索引。 tidb_build_stats_concurrency 可以控制同时执行的任务的数量,其默认值是 4。

tidb_distsql_scan_concurrency

在执行分析普通列任务的时候, tidb_distsql_scan_concurrency 可以用于控制一次读取的 Region 数量,其默认值是 15。

tidb_index_serial_scan_concurrency

在执行分析索引列任务的时候, tidb_index_serial_scan_concurrency 可以用于控制一次读取的 Region 数量,其默认值是 1。

1 个赞

与设置的并发度有关系

1 个赞

我准备使用默认值设置,尽量不去动生产TiDB配置。

默认不一定最合适,线上资源使用不高,但是有大量DML,影响表健康度,那么设置大一点,周期较短,会更适合一点,还是取决于具体场景吧

1 个赞


5 台双路物理服务器上,共 10 个 tikv 实例,大力 analyze 一张 200 亿数据量表的耗时,命令如下:

set @@session.tidb_distsql_scan_concurrency=60;
set @@session.tidb_index_serial_scan_concurrency=10;
set @@session.tidb_build_stats_concurrency=60;
analyze table account;

集群信息:


2 个赞

每台TiKV什么配置(内存、cpu)? 做参考。

40vcore,192G 内存,2*P4510 4TB nvmessd,10GbE

1 个赞

我在执行analyze table tt2时,kill不掉相关进程,主要就是防止在生产TiDB库执行过程中IO过高导致MQ拥堵,测试kill不了,有没有好的办法可以直接kill?

KILL TIDB  13;

试一下。

还是不能kill

读问题都不大。关键提问题的人可能涉及到写。

假设我在执行analyze时候,MQ堵的厉害,此时我kill此analyze操作,然后过些时日再执行analyze,是不是就相当于重新执行一下analyze操作,有没有其它影响?

今天我用analyze给表做了分析,但是感觉没有释放多少磁盘空间,前面我用delete删除大部分数据,我的TiDB版本是5.1.0
1、analyze执行时间。

2、analyze执行前表占用磁盘情况。

3、analyze执行后表占用磁盘情况。

这个问题和硬件的配置及数据量有关系没有明确的答案,只能是提供一个标准的环境做个测试。

你好,我上次成功执行完analyze,但是感觉没有释放多少磁盘空间,经查询v5.1存在bug(见下图),我准备将参数gc.enable-compaction-filter由true修改为false, 然后重启集群,看看能不能释放磁盘空间。针对此参数的设置不知有何风险及注意事项?

analyze没有释放磁盘空间的功能。

我准备将参数gc.enable-compaction-filter由true修改为false, 然后重启集群,看看能不能释放磁盘空间。针对此参数的设置不知有何风险及注意事项?