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_*プロシージャは表/スキーマの統計を指定時刻の状態に戻す。no_invalidate=>FALSEでカーソルが直ちに再解析される。

使用する場面

夜間の統計収集後に計画劣化が発生したときの最速のロールバックとして。変更が統計に起因するかのテストに。

注意

ライセンス不要。ロックされた統計はリストアできない(先にロック解除する)。リストア後、次の自動収集で新しい統計が戻る。恒久的な修正には表の設定、統計のロック、またはSQL計画ベースラインを使用する。保存期間が長いとSYSAUX(WRI$_OPTSTAT_*表)が肥大化する。

DBAtlas で開く →

関連項目