将统计信息恢复到过去某个时间点
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_* 表)。