OceanBase数据库的统计信息管理实践

简介:

数据库统计信息是数据库自动收集的“数据指纹”,记录表的大小、字段值的分布规律(如重复率、最大值/最小值)等关键指标。这些信息如同导航系统的实时交通数据,帮助查询优化器快速判断最佳执行路径。例如,当统计信息显示某字段90%的值重复时,优化器会放弃低效的索引扫描,转而选择全表扫描。通过动态更新统计信息(如每日或数据变化时),数据库能持续适应业务数据的波动,避免因数据量激增或分布倾斜导致的性能下降。其核心价值在于将“盲目猜测”转化为“量化决策”,使海量数据查询始终高效稳定。

既然统计信息如此重要,那如何管理呢?统计信息的管理分为两种,手动管理自动管理,如下举例说明:

手动收集统计信息(DBMS_STATS):

obclient [test3]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| oceanbase          |
| test               |
| test3              |
+--------------------+
5 rows in set (0.449 sec)

obclient [test3]> show tables;
+-----------------+
| Tables_in_test3 |
+-----------------+
| t1              |
+-----------------+
10 rows in set (0.676 sec)
--查看某张表上次收集统计信息的时间
obclient(root@test1)[test3]> select OWNER,TABLE_NAME,LAST_ANALYZED from oceanbase.dba_tab_statistics where table_name = 'T1';
+-------+------------+----------------------------+
| OWNER | TABLE_NAME | LAST_ANALYZED              |
+-------+------------+----------------------------+
| test3 | t1         | 2025-08-12 14:23:39.220490 |
+-------+------------+----------------------------+
1 row in set (0.276 sec)

obclient [test3]> CALL DBMS_STATS.GATHER_SCHEMA_STATS ('test3',degree=>8,method_opt=>'FOR ALL COLUMNS SIZE AUTO');    --收集整个数据库下的表和索引,包含直方图
Query OK, 0 rows affected (19.241 sec)

obclient [test3]> CALL DBMS_STATS.GATHER_TABLE_STATS('test3','t1',degree=>4,method_opt=>'FOR ALL COLUMNS SIZE SKEWONLY', force=>TRUE);    --收集指定表
Query OK, 0 rows affected (0.615 sec)

obclient [test3]> CALL DBMS_STATS.GATHER_TABLE_STATS('test3', 't1', degree=>4, method_opt=>'FOR COLUMNS name SIZE 5');    --收集直方图指定列的名字和桶的个数
Query OK, 0 rows affected (0.868 sec)

obclient [test3]> CALL DBMS_STATS.GATHER_INDEX_STATS('test3','IND1',degree=>4,tabname=>'t1',method_opt=>'FOR ALL COLUMNS SIZE REPEAT');    --索引不能用method_opt
ERROR 1327 (42000): Undeclared variable: method_opt

obclient [test3]> CALL DBMS_STATS.GATHER_INDEX_STATS('test3','IND1',degree=>4,tabname=>'t1');    --收集索引的统计信息
Query OK, 0 rows affected (0.881 sec)

参数说明:

method_opt=>FOR ALL [INDEXED | HIDDEN] COLUMNS [size_clause]| FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]…]

size_clause: SIZE integer | SIZE REPEAT | SIZE AUTO| SIZE SKEWONLY

SIZE integer:指定收集列的直方图桶的个数,范围在 [1-2048]。 --这个选项需要指定列和桶的数量,手动指定

SIZE REPEAT:仅仅只收集已经有收集过的直方图的列的直方图,使用之前收集直方图设置的桶个数。 --这个类似之前收集过,修复一下直方图数据

SIZE AUTO:由数据库优化器来决定是否收集列的直方图,取决于列的使用情况,桶个数使用默认值为 254。 --这个数据库自动判断

SIZE SKEWONLY:仅仅只收集数据分布不均匀的列的直方图,直方图桶个数使用默认值为 254。 --这个针对数据倾斜的列

手动收集统计信息(ANALYZE):

obclient [test3]> ANALYZE TABLE t1 COMPUTE STATISTICS FOR ALL COLUMNS SIZE 100;            --收集表的所有列并收集直方图信息
ERROR 1235 (0A000): The Oracle-mode analyze syntax is used in the disable sql extension MySQL-mode not supported

obclient [test3]> ANALYZE TABLE t1 COMPUTE STATISTICS FOR ALL INDEXED COLUMNS SIZE 100;    --收集表的所有索引列并收集直方图信息
ERROR 1235 (0A000): The Oracle-mode analyze syntax is used in the disable sql extension MySQL-mode not supported

obclient [test3]> ANALYZE TABLE t1 COMPUTE STATISTICS FOR ALL HIDDEN COLUMNS SIZE 100;     --收集表的所有隐藏列并收集直方图信息
ERROR 1235 (0A000): The Oracle-mode analyze syntax is used in the disable sql extension MySQL-mode not supported

obclient [test3]> ANALYZE TABLE t1 COMPUTE STATISTICS FOR COLUMNS name SIZE 100;           --收集指定列的统计信息并收集直方图信息
ERROR 1235 (0A000): The Oracle-mode analyze syntax is used in the disable sql extension MySQL-mode not supported

参数说明:FOR ALL [INDEXED | HIDDEN] COLUMNS:收集表的统计信息,同时收集指定列(所有列、索引列或隐藏列)的直方图信息。

注意:M模式不支持,O模式支持。

自动收集统计信息:

自动统计信息收集中,判断一个表的统计信息是否过期,主要依据上一次统计信息收集时间到本次收集期间该表的做增/删/改的比例(默认 10%),可以通过如下视图查看:

obclient [test3]> select * from oceanbase.DBA_TAB_MODIFICATIONS where table_owner='test3' and table_name = 't1';
+-------------+------------+----------------+-------------------+---------+---------+---------+------------+-----------+---------------+
| TABLE_OWNER | TABLE_NAME | PARTITION_NAME | SUBPARTITION_NAME | INSERTS | UPDATES | DELETES | TIMESTAMP  | TRUNCATED | DROP_SEGMENTS |
+-------------+------------+----------------+-------------------+---------+---------+---------+------------+-----------+---------------+
| test3       | t1         | NULL           | NULL              |       0 |       0 |       0 | 2025-10-20 | NULL      |          NULL |
| test3       | t1         | NULL           | NULL              |       0 |       0 |       0 | 2025-08-11 | NULL      |          NULL |
+-------------+------------+----------------+-------------------+---------+---------+---------+------------+-----------+---------------+
2 rows in set (0.220 sec)

参数说明:

INSERTS/UPDATES/DELETES:统计自上一次自动收集统计信息以来的 DML 执行次数,转储合并后显示的是 DML 修改的记录个数。

TRUNCATED:指示上一次自动收集统计信息后该表、分区是否被 Truncate 过。

DROP_SEGMENTS:自上次分析以来删除的分区和子分区段数。

自动收集统计信息的策略管理:

查看收集策略:

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT') FROM DUAL;            --查看全局的策略
+---------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT') |
+---------------------------------------+
| 10                                    |
+---------------------------------------+
1 row in set (0.033 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3') FROM DUAL;    --查看指定SCHEMA的策略,这种方式默认还是全局的,不能直接查询SCHEMA的策略
+------------------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3') |
+------------------------------------------------+
| 10                                             |
+------------------------------------------------+
1 row in set (0.003 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') FROM DUAL;    --查看指定表的策略
+------------------------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') |
+------------------------------------------------------+
| 10                                                   |
+------------------------------------------------------+
1 row in set (0.012 sec)

注意:查看策略基本上就是全局和表的级别,没有SCHEMA级别,即使SQL能执行成功。

设置收集策略:

obclient [test3]> CALL DBMS_STATS.SET_GLOBAL_PREFS('INCREMENTAL', 'TRUE');            --设置全局的收集策略
Query OK, 0 rows affected (0.059 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('INCREMENTAL') FROM DUAL;                --查看策略
+-------------------------------------+
| DBMS_STATS.GET_PREFS('INCREMENTAL') |
+-------------------------------------+
| TRUE                                |
+-------------------------------------+
1 row in set (0.004 sec)

obclient [test3]> CALL DBMS_STATS.SET_SCHEMA_PREFS('test3','DEGREE','8');               --设置SCHEMA的收集策略
Query OK, 0 rows affected (0.015 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('DEGREE') FROM DUAL;
+--------------------------------+
| DBMS_STATS.GET_PREFS('DEGREE') |
+--------------------------------+
| NULL                           |
+--------------------------------+
1 row in set (0.004 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('DEGREE', 'test3') FROM DUAL;            --并未生效,不能直接通过这样的方式查询SCHEMA下的策略
+-----------------------------------------+
| DBMS_STATS.GET_PREFS('DEGREE', 'test3') |
+-----------------------------------------+
| NULL                                    |
+-----------------------------------------+
1 row in set (0.004 sec)

obclient [test3]> CALL DBMS_STATS.SET_TABLE_PREFS('test3','t1','STALE_PERCENT','50');        --设置表的收集策略
Query OK, 0 rows affected (0.066 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT') FROM DUAL;
+---------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT') |
+---------------------------------------+
| 10                                    |
+---------------------------------------+
1 row in set (0.004 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') FROM DUAL;
+------------------------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') |
+------------------------------------------------------+
| 50                                                   |
+------------------------------------------------------+
1 row in set (0.004 sec)

obclient [test3]> CALL DBMS_STATS.SET_SCHEMA_PREFS('test3','STALE_PERCENT','29');
Query OK, 0 rows affected (0.190 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT') FROM DUAL;                        --查看全局的策略
+---------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT') |
+---------------------------------------+
| 10                                    |
+---------------------------------------+
1 row in set (0.004 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3') FROM DUAL;                --SCHEMA策略并未生效,不能直接通过这样的方式查询SCHEMA下的策略
+------------------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3') |
+------------------------------------------------+
| 10                                             |
+------------------------------------------------+
1 row in set (0.004 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') FROM DUAL;            --需要使用SCHEMA下表的方式间接确认SCHEMA的策略
+------------------------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') |
+------------------------------------------------------+
| 29                                                   |
+------------------------------------------------------+
1 row in set (0.004 sec)

obclient [test3]> CALL DBMS_STATS.DELETE_TABLE_PREFS('test3', 'T1', 'STALE_PERCENT');                --删除表的策略
Query OK, 0 rows affected (0.192 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') FROM DUAL;
+------------------------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') |
+------------------------------------------------------+
| 10                                                   |
+------------------------------------------------------+
1 row in set (0.011 sec)

obclient [test3]> CALL DBMS_STATS.DELETE_SCHEMA_PREFS('test3', 'STALE_PERCENT');                    --删除SCHEMA的策略
Query OK, 0 rows affected (0.061 sec)

obclient [test3]> SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') FROM DUAL;
+------------------------------------------------------+
| DBMS_STATS.GET_PREFS('STALE_PERCENT', 'test3', 'T1') |
+------------------------------------------------------+
| 10                                                   |
+------------------------------------------------------+
1 row in set (0.007 sec)
参数 说明
APPROXIMATE_NDV 是否使用估算方式计算 NDV,默认为 True。
CASCADE 是否同时收集表和索引的统计信息,默认为 True。
DEGREE 设置统计信息收集任务的并行度,默认为 1。
ESTIMATE_PERCENT 设置数据采样比例,默认使用自适应的比例。
GRANULARITY 设置统计信息收集时的分区粒度,默认为 AUTO。
INCREMENTAL 是否采用增量收集策略,默认为 False。
METHOD_OPT 设置收集直方图信息的默认选项。
STALE_PERCENT 设置导致统计信息过期的数据变更百分比,默认 10%。
STATS_RETENTION 设置历史统计信息的保留时间,默认 31 天。

注意:以上为参数的设置,在设置时,需要看清楚,有全局的、有SCHEMA级别、有表级的,在设置参数值时,最好带上单引号。在删除SCHEMA和表级的策略后,会恢复为全局的策略

查看自动收集统计信息策略:

obclient [test3]> select JOB_NAME,JOB_ACTION,REPEAT_INTERVAL,ENABLED,NEXT_RUN_DATE,MAX_RUN_DURATION from oceanbase.DBA_SCHEDULER_JOBS where JOB_NAME like '%WINDOW';
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| JOB_NAME         | JOB_ACTION                                             | REPEAT_INTERVAL         | ENABLED | NEXT_RUN_DATE              | MAX_RUN_DURATION |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| FRIDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-24 22:00:00.000000 |            14400 |
| MONDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-20 22:00:00.000000 |            14400 |
| SATURDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-25 22:00:00.000000 |            14400 |
| SUNDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-26 22:00:00.000000 |            14400 |
| THURSDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-23 22:00:00.000000 |            14400 |
| TUESDAY_WINDOW   | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-21 22:00:00.000000 |            14400 |
| WEDNESDAY_WINDOW | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-22 22:00:00.000000 |            14400 |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
7 rows in set (0.008 sec)
维护窗口 日期
MONDAY_WINDOW 星期一
TUESDAY_WINDOW 星期二
WEDNESDAY_WINDOW 星期三
THURSDAY_WINDOW 星期四
FRIDAY_WINDOW 星期五
SATURDAY_WINDOW 星期六
SUNDAY_WINDOW 星期日

开启和关闭指定窗口的自动收集任务:

obclient [test3]> CALL DBMS_SCHEDULER.DISABLE('MONDAY_WINDOW');
Query OK, 0 rows affected (0.547 sec)

obclient [test3]> select JOB_NAME,JOB_ACTION,REPEAT_INTERVAL,ENABLED,NEXT_RUN_DATE,MAX_RUN_DURATION from oceanbase.DBA_SCHEDULER_JOBS where JOB_NAME like '%WINDOW';
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| JOB_NAME         | JOB_ACTION                                             | REPEAT_INTERVAL         | ENABLED | NEXT_RUN_DATE              | MAX_RUN_DURATION |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| FRIDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-24 22:00:00.000000 |            14400 |
| MONDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 0       | 2025-10-20 22:00:00.000000 |            14400 |
| SATURDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-25 22:00:00.000000 |            14400 |
| SUNDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-26 22:00:00.000000 |            14400 |
| THURSDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-23 22:00:00.000000 |            14400 |
| TUESDAY_WINDOW   | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-21 22:00:00.000000 |            14400 |
| WEDNESDAY_WINDOW | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-22 22:00:00.000000 |            14400 |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
7 rows in set (0.010 sec)

obclient [test3]> CALL DBMS_SCHEDULER.ENABLE('MONDAY_WINDOW');
Query OK, 0 rows affected (0.438 sec)

obclient [test3]> select JOB_NAME,JOB_ACTION,REPEAT_INTERVAL,ENABLED,NEXT_RUN_DATE,MAX_RUN_DURATION from oceanbase.DBA_SCHEDULER_JOBS where JOB_NAME like '%WINDOW';
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| JOB_NAME         | JOB_ACTION                                             | REPEAT_INTERVAL         | ENABLED | NEXT_RUN_DATE              | MAX_RUN_DURATION |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| FRIDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-24 22:00:00.000000 |            14400 |
| MONDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-20 22:00:00.000000 |            14400 |
| SATURDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-25 22:00:00.000000 |            14400 |
| SUNDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-26 22:00:00.000000 |            14400 |
| THURSDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-23 22:00:00.000000 |            14400 |
| TUESDAY_WINDOW   | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-21 22:00:00.000000 |            14400 |
| WEDNESDAY_WINDOW | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-22 22:00:00.000000 |            14400 |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
7 rows in set (0.001 sec)

修改自动收集任务的参数:

obclient(root@test1)[test3]>  CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2025-10-26 01:00:00');
ERROR 5935 (HY000): The date is invalid. Please check wether they are the same day in a week, or the day is passed.

obclient(root@test1)[test3]>  CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2025-10-27 01:00:00');
Query OK, 0 rows affected (0.015 sec)

obclient(root@test1)[test3]>  CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2025-10-27 02:00:00');
Query OK, 0 rows affected (0.032 sec)

obclient(root@test1)[test3]>  CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2025-10-28 01:00:00');
ERROR 5935 (HY000): The date is invalid. Please check wether they are the same day in a week, or the day is passed.

obclient(root@test1)[test3]>  CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2025-11-01 01:00:00');
ERROR 5935 (HY000): The date is invalid. Please check wether they are the same day in a week, or the day is passed.

obclient(root@test1)[test3]>  CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2025-11-03 01:00:00');
Query OK, 0 rows affected (0.016 sec)

obclient(root@test1)[test3]> select JOB_NAME,JOB_ACTION,REPEAT_INTERVAL,ENABLED,NEXT_RUN_DATE,MAX_RUN_DURATION from oceanbase.DBA_SCHEDULER_JOBS where JOB_NAME like '%WINDOW';
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| JOB_NAME         | JOB_ACTION                                             | REPEAT_INTERVAL         | ENABLED | NEXT_RUN_DATE              | MAX_RUN_DURATION |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| FRIDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-24 22:00:00.000000 |            14400 |
| MONDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-11-03 01:00:00.000000 |            14400 |
| SATURDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-25 22:00:00.000000 |            14400 |
| SUNDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-26 22:00:00.000000 |            14400 |
| THURSDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-23 22:00:00.000000 |            14400 |
| TUESDAY_WINDOW   | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-21 22:00:00.000000 |            14400 |
| WEDNESDAY_WINDOW | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-22 22:00:00.000000 |            14400 |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
7 rows in set (0.001 sec)

obclient [test3]> CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW','JOB_ACTION','DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(18000000000)');
Query OK, 0 rows affected (0.105 sec)

obclient [test3]> select JOB_NAME,JOB_ACTION,REPEAT_INTERVAL,ENABLED,NEXT_RUN_DATE,MAX_RUN_DURATION from oceanbase.DBA_SCHEDULER_JOBS where JOB_NAME like '%WINDOW';
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| JOB_NAME         | JOB_ACTION                                             | REPEAT_INTERVAL         | ENABLED | NEXT_RUN_DATE              | MAX_RUN_DURATION |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
| FRIDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-24 22:00:00.000000 |            14400 |
| MONDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(18000000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-11-03 01:00:00.000000 |            14400 |
| SATURDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-25 22:00:00.000000 |            14400 |
| SUNDAY_WINDOW    | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-26 22:00:00.000000 |            14400 |
| THURSDAY_WINDOW  | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-23 22:00:00.000000 |            14400 |
| TUESDAY_WINDOW   | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-21 22:00:00.000000 |            14400 |
| WEDNESDAY_WINDOW | DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC(14400000000) | FREQ=WEEKLY; INTERVAL=1 | 1       | 2025-10-22 22:00:00.000000 |            14400 |
+------------------+--------------------------------------------------------+-------------------------+---------+----------------------------+------------------+
7 rows in set (0.001 sec)

注意(PPT上没有的知识:thinking:):在设置指定窗口的收集任务参数时,修改时间是重点,这个时间不能是之前已经设置过的、不能是非窗口的日期,也就是说可以设置下次任务的时间,日期的话必须是该窗口的日期,如:上次收集任务周一是2025-10-20 01:00:00,那么下次有效的设置可以为2025-10-27 01:00:00,2025-10-27 02:00:00,2025-11-03 02:00:00 。这个理解为每周对应一天,周一不能用其他任务的日期,步长就是以周为单位进行的,这次周一日期,下次周一日期,下下次周一日期,不能用其他日期(如周二的日期)。

16 个赞

想要问什么

8 个赞

学习了

6 个赞

学习了

6 个赞

学习了

8 个赞

可以作为实验手册来使用了

7 个赞

分享了

7 个赞

点赞

8 个赞

好文必赞!

8 个赞

牛逼牛逼

7 个赞

好文章啊,学习了

8 个赞

厉害了

7 个赞

学起来

7 个赞

你这可以写个博客了啊~

4 个赞

学习了

4 个赞

学习了

4 个赞

666

5 个赞

学习了

4 个赞

:100: :+1: :100: :+1:

2 个赞