# 统计信息自动收集 本章节描述了 OushuDB 的自动维护统计信息功能。 ## 概述 数据库通过实时监控表上的修改来决定是否触发自动统计信息收集以避免过期的统计信息导致的查询性能下降。 自动收集统计信息分为两种触发方式:同步以及异步。当向表中导入数据时,如果表没有统计信息,则立即触发一个 ANALYZE 命令,结果保证对下一条 SQL 可见。对于被 ANALYZE 过的表,数据库会监控所有的修改信息,当修改量达到一定比例时,触发异步的 AUTO ANALYZE 。 分区子表行为和普通表一致,支持同步 ANALYZE 以及异步自动 ANALYZE。 目前仅支持定制版 hudi orc 内表。 ## 同步 AUTO ANALYZE 修改表时,如果目标表没有统计信息,且 gp_autostats_mode / gp_autostats_mode_in_functions 配置为 true 时,会触发同步的 ANALYZE 。修改包括 INSERT ,UPDATE ,CREATE TABLE AS SELECT ,COPY 等。支持所有格式内表。 ## 异步 AUTO ANALYZE 对于被 ANALYZE 过的表(不管是手动还是由 gp_autostats_mode 触发的),如果 enable_auto_analyze 配置为 true , 且该表为定制版 hudi orc 内表,则该修改记录会被发送到元数据集群中。 如果累计修改量达到阈值, 且当前时间在 autostat_time_windows 指定的时间段内, 则会生成后台 ANALYZE 任务, 然后由某一个 main 节点执行, 执行时所用的资源队列为最近一次产生修改的用户对应的资源队列。 ### 触发条件 假设上一次 ANALYZE 后表有 X 行,则当表修改量达到 X * autostat_scale + autostat_threshold 时,触发异步 AUTO ANALYZE 。默认值分别为 0.2 以及 1000 ,修改时需要用 oushudb reload 命令使其生效。 ## 并行度 可以控制异步 AUTO ANALYZE 的全局最大并行度, 由 autostat_max_workers 控制。 如果配置为0, ANALYZE 任务依旧会产生,但不会执行。可以通过 oushudb reload 命令修改并行度。 ## 持久化 目前 AUTO ANALYZE 所有状态不会持久化, 重启元数据集群会导致这部分信息丢失, 如累计修改量以及 ANALYZE 任务。 ## 大数据量优化 默认配置下,当表行数超过 500 万行时,ANALYZE 会启用采样优化,相比传统的 ANALYZE 实现,性能提升 5 ~ 100+ 倍,越大的表加速比越高。但需要注意,如果发现在 default_statistics_target 为默认值时, 500 ~ 3000 万行的表/子分区有统计信息不准确的问题,请调大 enable_sample_analyze_threshold 到 300 。通常情况下不要调小 enable_sample_analyze_threshold ,可能导致不预期的统计信息失真。