ラァンフォーヱヴアー

出先・常駐先用コマンドリスト。2020年からリモートワークなので常駐なくなったけど。その他思ったことメモ。

統計情報の移行手順

統計情報を移行する。

例えば大量データが入っている本番環境の統計情報を開発環境にもってくることで大量データ入れなくても同じ実行計画を取れたり、 反対にテスト環境で大量データを入れてテストした結果を稼働前の本番環境に入れるみたいなことをする。

イマドキは定期的に統計情報とる運用が多いような気もするが(どっちが多いんだろう?)、「統計情報は一度決まったもので固定すべき!」スタイルの環境で便利な技。

systemユーザでやる。

移行元

  1. DBMS_STATS.CREATE_STAT_TABLEプロシージャを使用し、統計保存用テーブル(ここではXX_STATS_ALL)を作成。

    exec DBMS_STATS.CREATE_STAT_TABLE('SYSTEM', 'XX_STATS_ALL');

  2. 作成した統計保存テーブル(XX_STATS_ALL)にテーブルとインデックスの統計を保存する。

    exec DBMS_STATS.EXPORT_DATABASE_STATS ('XX_STATS_ALL',statown =>'SYSTEM');

  3. Data Pumpにて統計情報をエクスポート(ディレクトリは適宜定義する。以下はDATA_PUMP_DIRというディレクトリが定義してある前提)。ちなみにこれはOSコマンド。

    expdp system/manager directory=DATA_PUMP_DIR TABLES=SYSTEM.XX_STATS_ALL logfile=EXP_XX_STATS_ALL.log

移行先

  1. Data Pumpにて統計情報をインポート(同じくDATA_PUMP_DIRが定義してある前提)。ちなみにこれはOSコマンド。

    impdp system/manager directory=DATA_PUMP_DIR dumpfile=expdat.dmp TABLES=SYSTEM.XX_STATS_ALL logfile=IMP_XX_STATS_ALL.log

  2. 統計保存用テーブルから統計情報を戻す

    exec DBMS_STATS.IMPORT_DATABASE_STATS(stattab =>'XX_STATS_ALL',statown =>'SYSTEM');

  3. 統計情報が更新されたことを確認する。

    select to_char(stats_update_time, 'YYYY/MM/DD HH24'), count(*)
    from dba_tab_stats_history
    group by to_char(stats_update_time, 'YYYY/MM/DD HH24')
    order by to_char(stats_update_time, 'YYYY/MM/DD HH24');