tidb的analyze

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

测试环境下,126G内存40C,3.6T磁盘(普通盘,非SSD)。
PD V6.5.2
目测造一个29.89亿的表,包含49个bigint(其中10个有值) ,9个text(2个有值) ,4个datetime(4个有值),9个varchar(9个有值),2个decimal (2个有值) 。
已经停止造数据2天了。但是每天都会对这个表进行analyze table ,每次耗时12小时左右 。
如果关闭自动analyze ,那么以后就不会analyze table ,就可能导致查询性能不好;
如果不关闭自动analyze ,那么生产如果有多个大表,每天都在analyze table 中度过。
是否可以每次有增删改 到单表的某个百分比才重新analyze ?

tidb_auto_analyze_ratio这个参数就是用来控制多少数据变更才触发自动收集统计信息的,你看下是多少,另外SHOW ANALYZE STATUS
看下是不是这个表每天的自动统计信息收集任务都失败了
如果自动收集失败了,建议手工收集一下看看
SET tidb_build_stats_concurrency=16;
SET tidb_distsql_scan_concurrency =64;
ANALYZE TABLE table_name WITH 0.1 SAMPLERATE;—收集10%的统计信息

3 个赞

手动执行 analyze table 和 自动执行 analyze table ,并行度不一样,所以执行快慢上差别很大

如果允许,可以考虑 auto analyze table + 辅助脚本执行 analyze table,来满足不同的业务场景

如果关闭了,则会影响到数据的信息采集,会导致执行计划有偏差,当然,也可以采用hint 的方式,直接跳过执行计划…

建议根据你的实际情况,测试后看看那种方式更合适…

1 个赞

tidb_auto_analyze_ratio:这个参数表示在修改一张表的数据行数超过总行数的多少百分比后,将触发自动的表分析任务。默认值是 0.5,即当修改的数据行数超过总行数的 50% 时触发自动分析。

1 个赞

Fail_reason: [tikv:1317]Query execution was interrupted
好吧,好像看到的最近几次都是这个报错,应该的收集信息失败。

1 个赞

警告
锁定统计信息目前为实验特性,不建议在生产环境中使用。

从 v6.5.0 开始,TiDB 引入了锁定统计信息的特性。当一张表的统计信息被锁定以后,该表的统计信息将无法被修改,也无法对该表进行 ANALYZE 操作。用例如下:
mysql> lock stats t;

1 个赞

有参数可以控制表数据修改比率超过多少才进行统计信息收集操作

我用的是V7.5.1 ,tidb_auto_analyze_ratio 设置为 0.5 ,但是通过管理平台查看扫描的分析的频率来看,我的表数据变动应该是百万级,数据应该每天达不到变动 50 % ,它也进行操作了

可以通过参数设置百分比

这个是重新表吗

以目前TiDB收集统计信息的效率,使用这种超大表时使用Hints绑定执行计划靠谱一些,针对这种超大表的查询一旦因为统计信息收集或者其他导致优化器选择了错误的执行计划,影响还是比较大的。

自动执行 analyze table 这个是根据系统性能情况调度执行的,不怎么消耗性能

可以看看数据修改比率的参数,修改一下试试。

对的。我的表十几亿的。他不可能数据变动七八亿才会收集。