首批通过分布式安全可靠测评,为关键业务系统打造
自动统计信息收集
更新时间:2026-04-10 11:58:36
除了手动收集统计信息以外,目前 OceanBase 数据库优化器通过 MAINTENANCE WINDOW 来进行每日自动统计信息收集,从而保证统计信息能够迭代更新。同原生 Oracle 类似,OceanBase 数据库优化器定义周一到周日 7 个自动统计信息收集任务,周一到周五的任务默认开始时间为 22:00,最大收集时长 4 小时,周六周日的默认开始时间为 6:00,最大收集时长为 20 小时,如下表。
| 维护窗口名字 | 开始时间/频率 | 最大收集时长 |
|---|---|---|
MONDAY_WINDOW |
22:00/per week | 4 hours |
TUESDAY_WINDOW |
22:00/per week | 4 hours |
WEDNESDAY_WINDOW |
22:00/per week | 4 hours |
THURSDAY_WINDOW |
22:00/per week | 4 hours |
FRIDAY_WINDOW |
22:00/per week | 4 hours |
SATURDAY_WINDOW |
6:00/per week | 20 hours |
SUNDAY_WINDOW |
6:00/per week | 20 hours |
查询自动统计信息收集的执行情况
目前 OceanBase 数据库优化器对外提供了如下表的视图用于查询自动统计收集的执行情况。
| 模式 | 视图名 | 描述 |
|---|---|---|
| Oracle | DBA_SCHEDULER_JOBS |
查询 job 信息 |
| Oracle | ALL_SCHEDULER_WINDOWS、DBA_SCHEDULER_WINDOWS |
查询维护窗口执行信息 |
| MySQL | OCEANBASE.DBA_SCHEDULER_JOBS |
查询 job 信息 |
| MySQL | OCEANBASE.DBA_SCHEDULER_WINDOWS |
查询维护窗口执行信息 |
针对 DBA_SCHEDULER_JOBS 视图,主要看下面几个字段:
JOB_NAME:维护窗口任务的名字。LAST_START_DATE:上一次维护窗口任务执行的时间。NEXT_RUN_DATE:下一次维护窗口任务执行的时间。ENABLED:当前维护窗口任务是否启用。FAILURE_COUNT:维护窗口任务的失败次数,如果非 0,需要联系 OceanBase 技术支持排查。MAX_RUN_DURATION:维护窗口任务的最大持续时间,默认是单位是秒。
修改自动统计信息收集的属性
考虑到用户需要根据自身的业务特点去修改自动统计信息收集开始的时间及收集时长等属性,OceanBase 数据库优化器提供了如下方式去修改自动统计信息收集的属性:
禁止自动统计信息任务收集。
OceanBase 数据库可以使用系统包 DBMS_SCHEDULER.DISABLE 禁止自动统计信息任务收集。
示例如下:
MySQL 模式Oracle 模式禁止周一自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('MONDAY_WINDOW');禁止周二自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('TUESDAY_WINDOW');禁止周三自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('WEDNESDAY_WINDOW');禁止周四自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('THURSDAY_WINDOW');禁止周五自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('FRIDAY_WINDOW');禁止周六自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('SATURDAY_WINDOW');禁止周日自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('SUNDAY_WINDOW');
注意
在 Oracle 模式用户租户中执行以下语句时,需要使用对应的 sys 用户执行。
禁止周一自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('MONDAY_WINDOW');禁止周二自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('TUESDAY_WINDOW');禁止周三自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('WEDNESDAY_WINDOW');禁止周四自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('THURSDAY_WINDOW');禁止周五自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('FRIDAY_WINDOW');禁止周六自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('SATURDAY_WINDOW');禁止周日自动收集统计信息。
CALL DBMS_SCHEDULER.DISABLE('SUNDAY_WINDOW');
启用自动统计信息任务收集。
OceanBase 数据库可以使用系统包 DBMS_SCHEDULER.ENABLE 启用自动统计信息任务收集。
示例如下:
MySQL 模式Oracle 模式启用周一自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('MONDAY_WINDOW');启用周二自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('TUESDAY_WINDOW');启用周三自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('WEDNESDAY_WINDOW');启用周四自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('THURSDAY_WINDOW');启用周五自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('FRIDAY_WINDOW');启用周六自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('SATURDAY_WINDOW');启用周日自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('SUNDAY_WINDOW');
注意
在 Oracle 模式用户租户中执行以下语句时,需要使用对应的 sys 用户执行。
启用周一自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('MONDAY_WINDOW');启用周二自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('TUESDAY_WINDOW');启用周三自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('WEDNESDAY_WINDOW');启用周四自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('THURSDAY_WINDOW');启用周五自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('FRIDAY_WINDOW');启用周六自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('SATURDAY_WINDOW');启用周日自动收集统计信息。
CALL DBMS_SCHEDULER.ENABLE('SUNDAY_WINDOW');
调整自动统计信息收集的调度时间。
OceanBase 数据库自动收集任务是基于
DBMS_SCHEDULER实现,因此可以使用 DBMS_SCHEDULER.SET_ATTRIBUTE 进行调整自动统计信息的调度时间。注意
窗口下次执行时间必须是按照实际的星期情况来设置。
示例如下:
MySQL 模式Oracle 模式假如现在是 2024-03-07, 周四早上 11 点, 需要调整为从周五凌晨 2 点开始自动收集统计信息:
CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2024-03-11 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('TUESDAY_WINDOW', 'NEXT_DATE', '2024-03-12 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('WEDNESDAY_WINDOW', 'NEXT_DATE', '2024-03-13 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('THURSDAY_WINDOW', 'NEXT_DATE', '2024-03-14 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('FRIDAY_WINDOW', 'NEXT_DATE', '2024-03-08 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('SATURDAY_WINDOW', 'NEXT_DATE', '2024-03-09 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('SUNDAY_WINDOW', 'NEXT_DATE', '2024-03-10 02:00:00');注意
在 Oracle 模式用户租户中执行以下语句时,需要使用对应的 sys 用户执行。
设置日期格式。
SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';设置时间戳格式。
SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF';设置带时区的时间戳格式。
SET NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF TZR TZD';假如现在是 2024-03-07, 周四早上 11 点, 需要调整为从周五凌晨 2 点开始自动收集统计信息:
CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2024-03-11 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('TUESDAY_WINDOW', 'NEXT_DATE', '2024-03-12 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('WEDNESDAY_WINDOW', 'NEXT_DATE', '2024-03-13 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('THURSDAY_WINDOW', 'NEXT_DATE', '2024-03-14 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('FRIDAY_WINDOW', 'NEXT_DATE', '2024-03-08 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('SATURDAY_WINDOW', 'NEXT_DATE', '2024-03-09 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('SUNDAY_WINDOW', 'NEXT_DATE', '2024-03-10 02:00:00');
自动统计信息收集的工作机制
上面介绍了自动统计信息收集相关的 MAINTENANCE WINDOW 的内容,那么自动统计信息收集的任务开始之后的工作机制是如何的?下图展示了自动统计信息的工作机制。

针对上述自动统计信息收集中,判断一个表的统计信息是否过期,主要依据上一次统计信息收集时间到本次收集期间该表的做增/删/改的比例,默认值是 10%;需要注意的是这个变化比例是分区级别的,比如一个分区表的某些分区的增/删/改的比例超过了 10%,那么也会重新收集这些分区的统计信息,当然默认的变化比例是可以配置的,业务可以根据实际情况通过设置 perfs 进行调整,具体方式参见 配置统计信息的收集策略 节。除此之外,OceanBase 数据库优化器也提供了相关视图用于查询一张表的增/删/改次数,如下:
| 模式 | 视图名称 | 描述 |
|---|---|---|
| Oracle | ALL_TAB_MODIFICATIONS |
查询表所有的 DML stats |
| Oracle | DBA_TAB_MODIFICATIONS |
查询表所有的 DML stats |
| Oracle | USER_TAB_MODIFICATIONS |
查询表所有的 DML stats |
| MySQL | OCEANBASE.DBA_TAB_MODIFICATIONS |
查询表所有的 DML stats |