DBAtlas · 数据库运维图谱

将统计信息恢复到过去某个时间点

Oracle统计信息

命令

-- 1) Retention and the oldest point you can return to:
SELECT DBMS_STATS.GET_STATS_HISTORY_RETENTION    AS retention_days,
       DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY AS oldest_available
FROM   dual;

-- 2) Statistics history of the table:
SELECT table_name, partition_name,
       TO_CHAR(stats_update_time,'YYYY-MM-DD HH24:MI:SS TZH:TZM') AS stats_update_time
FROM   dba_tab_stats_history
WHERE  owner = 'CUSTOMER_APP' AND table_name = 'SALES'
ORDER  BY stats_update_time DESC;

-- 3) Return to the point before the plan regressed:
BEGIN
  DBMS_STATS.RESTORE_TABLE_STATS(
    ownname         => 'CUSTOMER_APP',
    tabname         => 'SALES',
    as_of_timestamp => TIMESTAMP '2026-10-07 22:00:00 +03:00',
    no_invalidate   => FALSE);
END;
/
-- Whole schema: DBMS_STATS.RESTORE_SCHEMA_STATS('CUSTOMER_APP', <timestamp>)

-- Change the retention (days):
-- EXEC DBMS_STATS.ALTER_STATS_HISTORY_RETENTION(31);

作用

DBMS_STATS 在每次收集前将之前的统计信息保存在 SYSAUX 中(默认 31 天)。RESTORE_* 过程将表/schema 统计信息恢复到指定时间的状态;使用 no_invalidate=>FALSE 时游标会立即重新解析。

适用场景

作为夜间统计信息收集后出现计划回归时最快的回滚手段,以及测试变化是否由统计信息引起。

注意

无需许可。已锁定的统计信息无法恢复(先解锁)。恢复后下一次自动收集会重新带来新的统计信息;如需永久修复,请设置表偏好、锁定统计信息或使用 SQL plan baseline。保留期过长会使 SYSAUX 增长(WRI$_OPTSTAT_* 表)。

在 DBAtlas 中打开 →

相关内容