首批通过分布式安全可靠测评,为关键业务系统打造
统计信息收集监控诊断
更新时间:2026-04-09 14:23:04
OceanBase 数据库优化器的统计信息收集过程比较耗时,特别是自动统计信息的收集操作。因为收集会涉及当前数据库中所有表,很有可能存在由于某种原因而出现收集失败的表。如果收集失败的表不能及时被诊断和反馈,会导致执行计划生成时无统计信息可用,从而生成烂计划,造成数据库系统运行异常。
在 OceanBase 数据库 V4.2.0 版本开始支持统计信息收集监控诊断功能,主要用于监控统计信息的收集状态,反馈统计信息的收集情况。
统计信息收集状态监测
当用户手动或者自动发起统计信息收集之后,可以通过 (G)V$OB_OPT_STAT_GATHER_MONITOR 视图查询实时统计信息收集状态,包括当前的收集任务执行时长、收集到的表的数量以及收集策略等实时信息,从而监测统计信息的收集情况。
对于 GV$OB_OPT_STAT_GATHER_MONITOR 视图,在 SYS 租户下访问时,显示的是所有租户的实时统计信息收集状态;在普通租户下访问时,显示的是本租户的实时统计信息收集状态。对于 V$OB_OPT_STAT_GATHER_MONITOR 视图,显示的当前租户在当前 OBServer 节点上的实时统计信息收集状态。
用户可通过 DESC 命令查询 (G)V$OB_OPT_STAT_GATHER_MONITOR 视图的字段信息,示例如下:
obclient [none]> USE oceanbase;
Database changed
obclient [oceanbase]> DESC GV$OB_OPT_STAT_GATHER_MONITOR;
+-----------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------------+--------------+------+-----+---------+-------+
| TENANT_ID | bigint(20) | NO | | NULL | |
| SVR_IP | varchar(46) | NO | | NULL | |
| SVR_PORT | bigint(20) | NO | | NULL | |
| SESSION_ID | bigint(20) | NO | | NULL | |
| TRACE_ID | varchar(64) | NO | | NULL | |
| TASK_ID | varchar(36) | NO | | NULL | |
| TYPE | varchar(16) | NO | | | |
| TASK_START_TIME | datetime(6) | NO | | NULL | |
| TASK_DURATION_TIME | bigint(20) | NO | | NULL | |
| TASK_TABLE_COUNT | bigint(20) | NO | | NULL | |
| COMPLETED_TABLE_COUNT | bigint(20) | NO | | NULL | |
| RUNNING_TABLE_OWNER | varchar(128) | NO | | NULL | |
| RUNNING_TABLE_NAME | varchar(256) | NO | | NULL | |
| RUNNING_TABLE_DURATION_TIME | bigint(20) | NO | | NULL | |
+-----------------------------+--------------+------+-----+---------+-------+
14 rows in set
(G)V$OB_OPT_STAT_GATHER_MONITOR 视图的字段信息含义如下:
TENANT_ID表示租户 ID。SVR_IP表示收集任务所在的节点地址。SVR_PORT表示收集任务所在的节点端口。SESSION_ID表示收集任务所在的会话 ID。TRACE_ID表示收集任务所在的 Trace ID。TASK_ID表示收集任务的 ID。TYPE表示收集的方式,目前有两种:MANUAL GATHER和AUTO GATHER。TASK_START_TIME表示收集任务的开始时间。TASK_DURATION_TIME表示整个收集任务的持续时间(单位:us)。TASK_TABLE_COUNT表示收集任务需要收集的表表的数量。COMPLETED_TABLE_COUNT表示收集任务已经完成的表表的数量。RUNNING_TABLE_OWNER表示收集任务正在收集表的用户名称。RUNNING_TABLE_NAME表示收集任务正在收集表的名称。RUNNING_TABLE_DURATION_TIME表示收集任务正在收集表的持续时间(单位:us)。
如下示例为对用表 test.t1 使用默认策略执行手动收集直方图统计信息。
CREATE TABLE test.t1(c1 INT, c2 INT, c3 INT, c4 INT, c5 INT, c6 INT, c7 INT, c8 INT, c9 INT, c10 INT);
CREATE TABLE t2 (c1 INT PRIMARY KEY);
INSERT INTO t2 VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
INSERT /*+APPEND*/ INTO t1 SELECT * FROM (SELECT s0.c1 c1, s1.c1 c2, s2.c1 c3, s3.c1 c4, s4.c1 c5, s5.c1 c6, s0.c1 * 10 c7, s1.c1 * 10 c8, s2.c1 * 10 c9, s3.c1 * 10 c10 FROM t2 s0, t2 s1, t2 s2, t2 s3, t2 s4, t2 s5);
CALL DBMS_STATS.GATHER_TABLE_STATS('test', 't1');
在收集过程中查询到指定 MySQL 租户的统计信息收集状态如下:
obclient> SELECT * FROM oceanbase.GV$OB_OPT_STAT_GATHER_MONITOR WHERE tenant_id = 1006;
+-----------+----------------+----------+------------+-----------------------------------+--------------------------------------+---------------+----------------------------+--------------------+------------------+-----------------------+---------------------+--------------------+-----------------------------+
| TENANT_ID | SVR_IP | SVR_PORT | SESSION_ID | TRACE_ID | TASK_ID | TYPE | TASK_START_TIME | TASK_DURATION_TIME | TASK_TABLE_COUNT | COMPLETED_TABLE_COUNT | RUNNING_TABLE_OWNER | RUNNING_TABLE_NAME | RUNNING_TABLE_DURATION_TIME |
+-----------+----------------+----------+------------+-----------------------------------+--------------------------------------+---------------+----------------------------+--------------------+------------------+-----------------------+---------------------+--------------------+-----------------------------+
| 1006 | xxx.xxx.xxx.xxx | 2882 | 3221575784 | YB42AC1E87C6-0005FF6AD9F825FB-0-0 | c921f339-1bc8-11ee-a7ea-52583362494c | MANUAL GATHER | 2023-07-06 14:46:07.691856 | 609652 | 1 | 0 | test | t1 | 609653 |
+-----------+----------------+----------+------------+-----------------------------------+--------------------------------------+---------------+----------------------------+--------------------+------------------+-----------------------+---------------------+--------------------+-----------------------------+
1 row in set
统计信息收集历史查询
OceanBase 数据库支持通过相关视图查询租户级别和表级别的历史统计信息收集状态。
查询租户级别的历史统计信息收集状态
用户可以通过 DBA_OB_TASK_OPT_STAT_GATHER_HISTORY 视图查询统计信息收集任务的详细状况,包括某张表的历史统计信息的收集情况和自动收集任务失败的列表详情等信息。
用户可通过 DESC 命令查询 DBA_OB_TASK_OPT_STAT_GATHER_HISTORY 视图的字段信息,示例如下:
obclient [none]> USE oceanbase;
Database changed
obclient [oceanbase]> DESC DBA_OB_TASK_OPT_STAT_GATHER_HISTORY;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| TENANT_ID | bigint(20) | NO | | NULL | |
| TASK_ID | varchar(36) | NO | | NULL | |
| TYPE | varchar(16) | NO | | | |
| STATUS | varchar(8) | NO | | | |
| TABLE_COUNT | bigint(20) | YES | | NULL | |
| FAILED_COUNT | bigint(20) | YES | | NULL | |
| START_TIME | datetime(6) | NO | | NULL | |
| END_TIME | datetime(6) | NO | | NULL | |
+--------------+-------------+------+-----+---------+-------+
DBA_OB_TASK_OPT_STAT_GATHER_HISTORY 视图的字段信息含义如下:
TENANT_ID表示租户 ID。TASK_ID表示收集任务的 ID。TYPE表示收集的方式,目前有两种:MANUAL GATHER和AUTO GATHER。STATUS表示收集任务的状态,当前两种状态:SUCCESS和FAILED。TABLE_COUNT表示收集任务所收集到的表的数量。FAILED_COUNT表示收集任务收集失败的表的数量。START_TIME表示收集任务的开始时间。END_TIME表示收集任务的结束时间。
如下示例为使用 DBA_OB_TASK_OPT_STAT_GATHER_HISTORY 视图查询指定租户的历史统计信息收集状态。
obclient [test]> USE oceanbase;
Database changed
obclient [oceanbase]> SELECT * FROM DBA_OB_TASK_OPT_STAT_GATHER_HISTORY WHERE TENANT_ID = 1006;
+-----------+--------------------------------------+---------------+---------+-------------+--------------+----------------------------+----------------------------+
| TENANT_ID | TASK_ID | TYPE | STATUS | TABLE_COUNT | FAILED_COUNT | START_TIME | END_TIME |
+-----------+--------------------------------------+---------------+---------+-------------+--------------+----------------------------+----------------------------+
| 1006 | 12551575-1a73-11ee-97fa-0eac862eb0b0 | AUTO GATHER | SUCCESS | 28 | 0 | 2023-07-04 22:00:00.669344 | 2023-07-04 22:00:06.636230 |
| 1006 | 32163b43-1bc9-11ee-a7ea-52583362494c | MANUAL GATHER | SUCCESS | 1 | 0 | 2023-07-06 14:49:03.775825 | 2023-07-06 14:49:05.729871 |
| 1006 | 44783d8c-1b3c-11ee-8ac6-d28f59026246 | AUTO GATHER | SUCCESS | 19 | 0 | 2023-07-05 22:00:00.767591 | 2023-07-05 22:00:22.035235 |
| 1006 | a1487d0e-185a-11ee-8ac6-d28f59026246 | AUTO GATHER | SUCCESS | 304 | 0 | 2023-07-02 06:00:00.673996 | 2023-07-02 06:00:29.273704 |
| 1006 | c921f339-1bc8-11ee-a7ea-52583362494c | MANUAL GATHER | SUCCESS | 1 | 0 | 2023-07-06 14:46:07.691856 | 2023-07-06 14:46:09.712585 |
| 1006 | db64f8b8-1bc5-11ee-a7ea-52583362494c | MANUAL GATHER | SUCCESS | 1 | 0 | 2023-07-06 14:25:09.839887 | 2023-07-06 14:25:12.686117 |
| 1006 | e7dc9678-19a9-11ee-95a7-2646ab385e11 | AUTO GATHER | SUCCESS | 23 | 0 | 2023-07-03 22:00:00.596163 | 2023-07-03 22:00:05.079117 |
+-----------+--------------------------------------+---------------+---------+-------------+--------------+----------------------------+----------------------------+
7 rows in set
查询表级别的历史统计信息收集状态
用户可以通过 DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY 视图查询某一个表的历史统计信息收集情况。
用户可通过 DESC 命令查询 DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY 视图的字段信息,示例如下:
obclient [none]> USE oceanbase;
Database changed
obclient [oceanbase]> DESC DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY;
+--------------------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+--------------+------+-----+---------+-------+
| OWNER | varchar(128) | NO | | | |
| TABLE_NAME | varchar(256) | NO | | | |
| TASK_ID | varchar(36) | NO | | NULL | |
| STATUS | varchar(8) | NO | | | |
| START_TIME | datetime(6) | YES | | NULL | |
| END_TIME | datetime(6) | YES | | NULL | |
| MEMORY_USED | bigint(20) | YES | | NULL | |
| STAT_REFRESH_FAILED_LIST | text | YES | | NULL | |
| PROPERTIES | text | YES | | NULL | |
+--------------------------+--------------+------+-----+---------+-------+
9 rows in set
DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY 视图的字段信息含义如下:
OWNER表示该表所属的用户。TABLE_NAME表示该表的名称。TASK_ID表示该表收集所属的收集任务 ID。STATUS表示该表收集的状态,当前两种状态:SUCCESS和FAILED。START_TIME表示该表收集开始的时间。END_TIME表示该表收集结束的时间。MEMORY_USED表示该表收集期间的内存使用。STAT_REFRESH_FAILED_LIST表示该表收集统计信息但刷新缓存失败的集群机器 IP 列表。PROPERTIES表示该表收集属性的设置。
如下示例为使用 DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY 视图查询用户 test 下所有表的历史统计信息收集状态。
obclient [test]> USE oceanbase;
Database changed
obclient [oceanbase]> SELECT * FROM DBA_OB_TABLE_OPT_STAT_GATHER_HISTORY WHERE OWNER = 'test';
+-------+--------------+--------------------------------------+---------+----------------------------+----------------------------+-------------+--------------------------+------------------------------------------------------------------------------------------------------------------------------------+
| OWNER | TABLE_NAME | TASK_ID | STATUS | START_TIME | END_TIME | MEMORY_USED | STAT_REFRESH_FAILED_LIST | PROPERTIES |
+-------+--------------+--------------------------------------+---------+----------------------------+----------------------------+-------------+--------------------------+------------------------------------------------------------------------------------------------------------------------------------+
| test | test_tbl3_h | 12551575-1a73-11ee-97fa-0eac862eb0b0 | SUCCESS | 2023-07-04 22:00:03.235058 | 2023-07-04 22:00:03.363855 | 22176 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | test_tbl2_hr | 12551575-1a73-11ee-97fa-0eac862eb0b0 | SUCCESS | 2023-07-04 22:00:02.994304 | 2023-07-04 22:00:03.232528 | 131208 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | test_tbl1_hr | 12551575-1a73-11ee-97fa-0eac862eb0b0 | SUCCESS | 2023-07-04 22:00:02.619126 | 2023-07-04 22:00:02.989421 | 131208 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | t1 | 32163b43-1bc9-11ee-a7ea-52583362494c | SUCCESS | 2023-07-06 14:49:03.775825 | 2023-07-06 14:49:05.729871 | 30084 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | test_tbl14 | 44783d8c-1b3c-11ee-8ac6-d28f59026246 | SUCCESS | 2023-07-05 22:00:16.057930 | 2023-07-05 22:00:16.232034 | 7936 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | tbl1 | 44783d8c-1b3c-11ee-8ac6-d28f59026246 | SUCCESS | 2023-07-05 22:00:15.578265 | 2023-07-05 22:00:16.049143 | 8160 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | t1 | c921f339-1bc8-11ee-a7ea-52583362494c | SUCCESS | 2023-07-06 14:46:07.691856 | 2023-07-06 14:46:09.712585 | 30084 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | t1 | db64f8b8-1bc5-11ee-a7ea-52583362494c | SUCCESS | 2023-07-06 14:25:09.839887 | 2023-07-06 14:25:12.686117 | 30084 | NULL | GRANULARITY:AUTO;METHOD_OPT:FOR ALL COLUMNS SIZE AUTO;DEGREE:1;ESTIMATE_PERCENT:100.000000;BLOCK_SAMPLE:0;STALE_PERCENT:-1.000000; |
| test | t2 | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+-------+--------------+--------------------------------------+---------+----------------------------+----------------------------+-------------+--------------------------+------------------------------------------------------------------------------------------------------------------------------------+
9 rows in set
统计信息收集历史信息的清理策略
OceanBase 数据库目前支持如下两种方式进行统计信息收集历史的清理:
- 使用
DBMS_STATS.PURGE_STATS($timestamp)方式进行手动清理。 - 设置自动定时任务检查超过保存期限的历史信息(默认 31 天)进行自动清理。
如下示例为使用 DBMS_STATS.PURGE_STATS($timestamp) 手动清理指定时间的历史统计信息。
/* MySQL 模式下 */
obclient [test]> CALL DBMS_STATS.PURGE_STATS ('2021-09-26 19:02:12.675729');
Query OK, 0 rows affected
/* Oracle 模式下 */
obclient [SYS]> CALL DBMS_STATS.PURGE_STATS(TO_TIMESTAMP('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF'));
Query OK, 0 rows affected