目前 OceanBase 数据库优化器通过基于 DBMS_SCHEDULER 系统包实现的 MAINTENANCE WINDOW 来实现每日的自动统计信息收集,从而保证统计信息的不断迭代更新。
MAINTENANCE WINDOW
OceanBase 数据库定义 MAINTENANCE WINDOW 为周一到周日有 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 |
查询 MAINTENANCE WINDOW 信息
目前 OceanBase 数据库中 MAINTENANCE WINDOW 是基于 DBMS_SCHEDULER 系统包实现的,因此也可以通过查询 DBMS_SCHEDULER 系统包相关视图来查询 MAINTENANCE WINDOW 的相关信息。
| 模式 | View Name | Description |
|---|---|---|
| Oracle 模式 | DBA_SCHEDULER_JOBS | 查询 Job 信息 |
| Oracle 模式 | SYS.ALL_VIRTUAL_TENANT_SCHEDULER_JOB_REAL_AGENT | 查询 Job 信息的代理表 |
| MySQL 模式 | OCEANBASE.DBA_SCHEDULER_JOBS | 查询 Job 信息 |
设置 MAINTENANCE WINDOW 属性
目前 OceanBase 数据库中 MAINTENANCE WINDOW 的属性设置也是通过 DBMS_SCHEDULER 系统包实现的,当前支持的属性设置语法如下:
禁止/启用自动统计信息任务收集:
DBMS_SCHEDULER.DISABLE($window_name); DBMS_SCHEDULER.ENABLE($window_name);示例 1:禁用周一自动收集统计信息
CALL DBMS_SCHEDULER.DISABLE('MONDAY_WINDOW');示例 2:启用周一自动收集统计信息
CALL DBMS_SCHEDULER.ENABLE('MONDAY_WINDOW');
设置统计信息任务下次开始的时间:
DBMS_SCHEDULER.SET_ATTRIBUTE($window_name, 'NEXT_DATE', $next_time);示例:设置周一自动收集统计信息开始的时间在晚上 8 点。
CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2022-09-12 20:00:00');设置统计信息任务收集的时长:
DBMS_SCHEDULER.SET_ATTRIBUTE($window_name, 'DURATION', $duration_time);示例:设置周一自动收集统计信息的持续时长为 6 小时。
CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'DURATION', '21600s');
DML STATS
DML STATS 用于记录一张表做增、删、改的次数。
表的 DML STATS 对于自动统计信息收集有着至关重要的作用,它决定了一张表是否需要再次收集统计信息。数据库中的表的数据信息并不是每天都会更新,因此对于不存在数据变化或者数据变化在预期范围内的表,不需要再次收集统计信息,这样可以提升自动统计信息收集任务的执行效率。
下表列举了 Oracle 和 MySQL 两种模式下支持查询 DML STATS 信息的相关视图和表信息。
| 模式 | 视图名称 | 描述 |
|---|---|---|
| Oracle 模式 | GV$DML_STATS、V$DML_STATS | 查询虚表中记录的表的 DML STATS |
| Oracle 模式 | SYS.ALL_VIRTUAL_MONITOR_MODIFIED_REAL_AGENT | 查询代理表中记录表的 DML STATS |
| Oracle 模式 | ALL_TAB_MODIFICATIONS、DBA_TAB_MODIFICATIONS、USER_TAB_MODIFICATIONS | 查询表中所有的 DML STATS |
| MySQL 模式 | OCEANBASE.GV$DML_STATS、OCEANBASE.V$DML_STATS | 查询虚表中记录的表的DML STATS |
| MySQL 模式 | OCEANBASE.DBA_TAB_MODIFICATIONS | 查询表中所有的 DML STATS |
自动统计信息收集策略
OceanBase 数据库中表的统计信息过期判断标准为,如果当前表增量的 DML 次数(上一次收集统计信息时 DML 次数到本次收集统计信息期间发生的增/删/改总次数)超过设置的阈值时就会过期。阈值的默认值是 10%,阈值可以通过 peres 调整设置,详细信息请参见 收集策略配置项(Prefs)管理功能。
目前 OceanBase 数据库优化器的自动统计信息收集策略如下:
系统表和非分区用户表的自动收集策略:
如果表没有
GLOBAL级别的统计信息,自动收集统计信息。如果表有
GLOBAL级别的统计信息,但是统计信息已经过期,则自动收集统计信息。
否则,OceanBase 数据库优化器不会自动收集统计信息。
OceanBase 数据库分区用户表的自动收集策略:
如果表没有任何统计信息,自动收集所有的统计信息。
如果表有分区级别的统计信息,但是没有
GLOBAL级别统计信息,则采用增量的方式自动收集统计信息。如果表有
GLOBAL级别统计信息,但是已经过期,则自动收集所有的统计信息。如果表有
GLOBAL级别统计信息,但是没有全部过期,只是部分分区的统计信息过期,则自动收集统计信息过期的分区统计信息,同时采用增量的方式推导GLOBAL级别统计信息。




