统计信息历史管理功能主要是指统计信息状态发生改变时(统计信息被重新收集、设置、删除、导入、锁定等),会将统计信息发生改变之前的统计信息状态保存到统计信息历史记录表中,统计信息历史记录表可以查询某张表的一个历史统计信息改变情况,同时也能够恢复指定历史版本的统计信息。
统计信息历史表及视图
OceanBase 数据库优化器使用如下视图来保存统计信息历史记录:
DBA_TAB_STATS_HISTORY用于保存表级的历史统计信息。DBA_TAB_COL_STATISTICS用于保存列级的基本历史统计信息。DBA_TAB_HISTOGRAMS用于保存列级的直方图历史统计信息。
统计信息历史管理相关函数
目前支持如下历史管理相关函数:
restore_table_stats恢复指定时刻的表级历史统计信息。restore_schema_stats恢复指定时刻的 Schema 级历史统计信息。purge_stats删除指定时刻之前的历史统计信息。alter_stats_history_retention修改历史统计信息的的保留间隔时间,默认保留间隔时间为 31 天。get_stats_history_retention获取当前历史统计信息的保留间隔时间。get_stats_history_availability获取当前可用的最早历史统计信息时间,无法恢复指定时间早于这个时间的历史统计信息。
具体的定义如下:
PROCEDURE restore_table_stats (
ownname VARCHAR2,
tabname VARCHAR2,
as_of_timestamp TIMESTAMP WITH TIME ZONE,
restore_cluster_index BOOLEAN DEFAULT FALSE,
force BOOLEAN DEFAULT FALSE,
no_invalidate BOOLEAN DEFAULT FALSE
);
PROCEDURE restore_schema_stats (
ownname VARCHAR2,
as_of_timestamp TIMESTAMP WITH TIME ZONE,
force BOOLEAN DEFAULT FALSE,
no_invalidate BOOLEAN DEFAULT FALSE
);
PROCEDURE purge_stats(
before_timestamp TIMESTAMP WITH TIME ZONE
);
PROCEDURE alter_stats_history_retention(
retention NUMBER
);
FUNCTION get_stats_history_retention RETURN NUMBER;
FUNCTION get_stats_history_availability RETURN TIMESTAMP WITH TIME ZONE;
参数解释如下表所示。
| 参数 | 解释 |
|---|---|
| ownname | 用户名。 |
| tabname | 表名称。 |
| as_of_timestamp | 指定恢复时间。 |
| restore_cluster_index | 该参数暂未实现,不可用。 |
| force | 强制恢复,并忽略加锁。默认是 False。 |
| no_invalidate | 该参数暂未实现,不可用。 |
统计信息历史清理策略
目前 OceanBase 数据库支持两种方式清理统计信息历史:自动清理和手动清理。
由于 OceanBase 数据库是一个分布式的数据库,因此没法直接在 Server 内部创建租户的同时自动去创建清理任务,因此需要显示地在创建好租户或者低版本的 Server 升级上来的租户中利用 DBMS_JOB 去创建一个定时任务来自动清理统计信息历史,示例如下。
##设置一个从现在开始,每隔一天执行自动清理统计信息历史的任务
DECLARE
jid BINARY_INTEGER;
BEGIN
DBMS_JOB.SUBMIT(jid, 'dbms_stats.purge_stats(NULL);', trunc(sysdate), 'trunc(sysdate) + 1');
COMMIT;
END;
默认的清理任务间隔是 31 天,可以通过 dbms_stats.alter_stats_history_retention() 去设置,有效范围值为 [0,365000]。如果设置为 0,则表示清除所有历史统计信息,后续也不在记录。
手动清理是指显示调用 dbms_stats.purge_stats() 命令去执行清理。
示例
获取当前历史统计信息的保留间隔时间。
SELECT dbms_stats.get_stats_history_retention() FROM DUAL;获取当前可用的最早历史统计信息时间。
SELECT dbms_stats.get_stats_history_availability() FROM DUAL;修改历史统计信息的保留间隔时间为 15 天。
CALL dbms_stats.alter_stats_history_retention(15);指定恢复用户名
test下的tbl1表在某个时刻下的统计信息。CALL dbms_stats.restore_schema_stats('test', 'tbl1', to_timestamp('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF'));手动清理指定时刻的历史统计信息。
CALL dbms_stats.purge_stats(to_timestamp('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF'));




