统计信息任务执行了,但是业务表的统计信息却没有更新

【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】5.7.25-OceanBase_CE-v4.3.0.1
【问题描述】在某个SQL查询时发现优化器估行值不对,于是查看了该表的统计信息,发现表的统计信息和当前信息差距较大,手动调用dbms_stats.gather_table_stats函数更新统计信息后正常。但是查看数据库其他业务表,发现很多表的统计信息和最新信息都有偏差,而定时更新统计信息任务正常执行。
系统自动收集统计信息截图如下,可以看出每日的任务都是运行了的:

查询业务表一的统计信息如下,最新更新时间为6-14,统计行数为151w:


而当前业务表实际行数为989w,6.14-6.24的增量为231w

查询业务表二的统计信息如下,最新更新时间为6-20,存储行19w:


当前实际行数为24w,且6.20-6.23号增量为3w+行,超过阈值10%=1.9w
image

【复现路径】
【附件及日志】

手动收集后查看是符合预期的,说明统计信息没有问题,是不是改过触发的阀值,造成的没有自动收集任务

使用如下sql先排查一下看看
– sys租户,查询非空则说明有租户调度异常(推荐)
SELECT tenant_id AS failed_scheduler_tenant_id
FROM oceanbase.__all_virtual_task_opt_stat_gather_history h
WHERE TYPE = 1
AND start_time > date_sub(now(), interval 1 day)
AND NOT EXISTS(SELECT 1
FROM oceanbase.__all_tenant t
WHERE h.tenant_id = t.tenant_id);

未改过阈值,且举例的业务表一当前行数都超过上次收集时行数的几倍了

可以修改时间函数 查询的时间
**步骤一,按照租户类别使用如下SQL查询进行检查,主要检查最近一天内的所有租户自动收集是否有正常调度,如果调度正常
– sys租户,查询非空则说明有租户调度异常(推荐)
SELECT tenant_id AS failed_scheduler_tenant_id
FROM oceanbase.__all_virtual_task_opt_stat_gather_history h
WHERE TYPE = 1
AND start_time > date_sub(now(), interval 1 day)
AND NOT EXISTS(SELECT 1
FROM oceanbase.__all_tenant t
WHERE h.tenant_id = t.tenant_id);
**步骤二,按照租户类别使用如下SQL查询进行检查,获取过去一天的自动收集是表收集失败列表,如果为空则说明自动收集正常
– sys租户,获取的所有租户信息,可以指定租户查询(推荐)
SELECT t_opt.tenant_id,
t_opt.task_id,
task_opt.start_time AS task_start_time,
task_opt.end_time AS task_end_time,
d.database_name,
t.table_name,
t_opt.table_id,
t_opt.ret_code,
t_opt.start_time,
t_opt.end_time,
t_opt.memory_used,
t_opt.stat_refresh_failed_list,
t_opt.properties
FROM (
SELECT task_id,
start_time,
end_time,
table_count
FROM oceanbase.__all_virtual_task_opt_stat_gather_history
WHERE type = 1
– AND tenant_id = {tenant_id}
AND start_time > date_sub(Now(), interval 1 day)) task_opt
JOIN oceanbase.__all_virtual_table_opt_stat_gather_history t_opt
JOIN oceanbase.__all_virtual_table t
JOIN oceanbase.__all_virtual_database d
WHERE t_opt.ret_code != 0
AND task_opt.task_id = t_opt.task_id
AND t_opt.table_id = t.table_id
AND t.database_id = d.database_id
AND t_opt.table_id > 200000;

两个SQL执行了,结果都是空,看起调度是正常的,但是查询DBA_TAB_STATISTICS表,发现业务表的统计结果还是没有按预期更新

DML STATS

DML STATS 用于记录一张表做增、删、改的次数。

表的 DML STATS 对于自动统计信息收集有着至关重要的作用,它决定了一张表是否需要再次收集统计信息。数据库中的表的数据信息并不是每天都会更新,因此对于不存在数据变化或者数据变化在预期范围内的表,不需要再次收集统计信息,这样可以提升自动统计信息收集任务的执行效率。
可以先看一下这个表里的信息是否正常?

查询表级别的历史统计信息收集状态

用户可以通过 DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY 视图查询某一个表的历史统计信息收集情况。
也可以通过这个视图看一下一个表的统计信息历史信息