统计信息自动收集#

本章节描述了 OushuDB 的自动维护统计信息功能。

概述#

数据库通过实时监控表上的修改来决定是否触发自动统计信息收集以避免过期的统计信息导致的查询性能下降。

自动收集统计信息分为两种触发方式:同步以及异步。当向表中导入数据时,如果表没有统计信息,则立即触发一个 ANALYZE 命令,在当前会话中执行。对于被 ANALYZE 过的表,数据库会监控所有的修改信息,当修改量达到一定比例时,触发异步的 ANALYZE 。

表级别配置自动收集统计信息#

建表时可以通过 reloption 指定是否启动 AUTO ANALYZE , 如以下语句可以指定建立的表禁用 AUTO ANALYZE 。

CREATE TABLE auto_analyze_relation(id INT, value INT)
with (appendonly = true, orientation = 'orc', autostat = off);

也可以通过 alter table 命令来更改已有表的配置:

alter table auto_analyze_relation set with(autostat = false);

当 autostat 配置为 false 时,同步和异步 AUTO ANALYZE 都不会自动触发,即该配置判定时具有最高优先级。下文触发规则仅当 autostat 配置为 true 时才生效 ,反之不会触发, 不再赘述。

对于没有指定 autostat 的表,数据库将使用默认值 true 。

同步 ANALYZE#

修改表时,如果目标表没有统计信息,且 autostat_on_no_stat 配置为 true 时,会触发同步的 ANALYZE 。修改包括 INSERT , DELETE , UPDATE , CREATE TABLE AS SELECT , COPY 等。表类型包括内表和外表,不包括元数据表。

异步 ANALYZE#

对于被 ANALYZE 过的表(不管是手动还是由 autostat_on_no_stat 触发的),如果 autostat_disabled 配置为 false , 且该表为内表(如 AO , Hudi , MagmaAP 表),则该修改记录会被发送到元数据集群中,

如果累计修改量达到阈值, 且当前时间在 autostat_time_windows 指定的时间段内, 则会生成后台 ANALYZE 任务, 然后由某一个 main 节点执行, 执行时所用的资源队列为最近一次产生修改的用户对应的资源队列。

对于非动态分区表来说,阈值的定义为: 上次 analyze 时的总行数 * autostat_scale + autostat_threshold 。 对于动态分区表来说,定义则为 autostat_dynpart_threshold , 当修改量超过该值时, 触发一个启发式的 ANALYZE 任务, 该任务会根据提交历史自动筛选需要 ANALYZE 的子分区。

分区表#

对静态分区表父表或者中间表进行操作时, 数据库实际上处理的是被修改的子表,因此所有子表的 AUTO ANALYZE 都会被正确地触发。

并行度#

可以控制异步 ANALYZE 的全局最大并行度, 由 autostat_max_workers 控制。 如果配置为0, ANALYZE 任务依旧会产生,但不会执行。

用户#

AUTO ANALYZE 默认只在表的创建者操作表时触发, 如果希望别的用户的操作也能够自动触发 ANALYZE , 需要将 autostat_allow_nonowner 配置为 true 。

持久化#

目前 AUTO ANALYZE 状态不会持久化, 重启元数据集群会导致这部分信息丢失, 如累计修改量以及 ANALYZE 任务。