持续执行ANALYZE TABLE好几天

【 TiDB 使用环境】生产环境
【 TiDB 版本】5.2.2
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
查看慢日志一直在执行一个SQL,执行好几天都没结束:
ANALYZE TABLE thc_5001_democqzs.form_engine_template;

【资源配置】资源混合部署
【附件:截图/日志/监控】

你这个是自动执行的job吧?
我之前遇到多,大表自动跑的一直失败,手动执行很快。可以手动跑下看看。

好的,我试试

analyze table 一般很快的(表在亿级别),因为analyze它是有个比例的抽样,不是整表统计

表大的话建议手动收集,可以WITH FLOAT_NUM SAMPLERATE分析小样本的数据,如果是全库有很多大表,又不愿意耗费太多的统计信息收集造成的消耗的话,可以将 tidb_enable_fast_analyze 设置为 1 来打开快速分析功能,不过不建议这样做,可以将tidb_auto_analyze_ratio自动阈值调大,然后部署手动任务对大表进行小样本分析

自动analyze慢是因为单线程跑的 。这个表里的数据变更频繁吗 ?

不频繁,使我们给客户私有化部署。初次MySQL同步到tidb后,就一直自动执行analyze

好的,多谢,我试一下这个参数

hi,有什么更新吗?

  1. (可能)auto_analyze 现在是写死的并发度 为 1 ,可能是数据量大导致就是很慢;
  2. (根因)现在其实还根因不明,analyze 慢只是现象,还需 表数据量,日志信息去分析为啥慢;
  3. (措施) tidb菜鸟一只 老师说的是一种可行的办法,但是降低 SAMPLERATE 有一定的执行计划不稳的可能;
  4. (措施) h5n1 老师说的也是一种可行的办法,手动 analyze 是可以调并发参数的,如果是因为数据量很大一直跑不完,这种办法是有效的。 tidb_build_stats_concurrency and tidb_distsql_scan_concurrency and tidb_index_serial_scan_concurrency

大表自动跑的一直失败 请问下为什么会失败呢

请问下老师,自动跑的analyze 语句会受到 max_execution_time 系统变量的控制嘛,如果自动跑的analyze 语句能够受到max_execution_time 系统变量控制的话,那么是不是可以把max_execution_time 设置一个能够接收的值呢?

自动跑是单线程跑的,肯定慢啊,所以会收集失败

难道是因为慢就收集失败?这不应该一直跑嘛,是不是有什么超时机制,或者跑的时候出问题了

有窗口期啊,不然一直跑,影响你正常业务了

你这个窗口期是通过max_execution_time 实现的嘛?

tidb_auto_analyze_start_time tidb_auto_analyze_end_time 这俩吧几点开始几点结束,大表不建议走自动收集,可以部署定时任务,开多线程小样本收集,不然太大的表真收集不完。。。

get了,多谢老师

其实也受这变量控制,多种条件相互干扰吧, tidb菜鸟一只 老师说的也是对的。

好的,谢谢


看下日志是不是这个错误“GC life time is shorter than transaction duration”?如果是,估计是大表,analyze超过了gc life time ;可以通过手动analyze或者建一个crontab任务来进行。