Oracle

  (最終更新日:2015.09.24)

【Oracle】テーブル指定で統計情報をバックアップ、インポートする方法とポイント

Oracle Databaseで、テーブルを指定して統計情報をバックアップし、またバックアップからインポートする際のメモです。

通常は統計情報の更新を停止させており、必要に応じてテーブル単位で統計情報を再取得するような運用のときに使えます。

現在の統計情報を確認する

まずは現在の統計情報を確認します。
対象のテーブルと関連するインデックスの統計情報があります。

SELECT
    tb.TABLE_NAME,
    tb.LAST_ANALYZED as LAST_ANALYZED_TABLE,
    idx.INDEX_NAME,
    idx.LAST_ANALYZED as LAST_ANALYZED_INDEX
FROM
    USER_TABLES tb
    left join USER_INDEXES idx on(tb.TABLE_NAME=idx.TABLE_NAME)
WHERE
    tb.TABLE_NAME = 'TABLE_A'
ORDER BY
    tb.TABLE_NAME

今回の結果は下記のような感じ。

TABLE_NAME LAST_ANALYZED_TABLE INDEX_NAME LAST_ANALYZED_INDEX
TABLE_A 2015/01/08 22:48:54 SYS_C0015113 2015/01/08 22:48:54
TABLE_A 2015/01/08 22:48:54 TABLE_A_INDEX99 2015/01/08 22:48:55

テーブルの統計情報をバックアップする

バックアップ用に統計情報を格納するテーブルを作成。

SQL> exec DBMS_STATS.CREATE_STAT_TABLE('USER_HOGE', 'STAT_BACKUP');

続いて EXPORT_TABLE_STATS で統計情報をバックアップしますが、この時、cascade オプションを TRUE に指定することで、関連するインデックスの統計情報も合わせてバックアップすることができます。

SQL> exec DBMS_STATS.EXPORT_TABLE_STATS(ownname => 'USER_HOGE' ,tabname => 'TABLE_A' ,stattab => 'STAT_BACKUP', cascade => TRUE);

 ➡ EXPORT_TABLE_STATSプロシージャ

テーブルを指定して統計情報を更新する

テーブルを指定して、テーブルと関連するインデックスそれぞれの統計情報を一気に更新してみます。

SQL> exec DBMS_STATS.GATHER_TABLE_STATS (OWNNAME => 'USER_HOGE', TABNAME => 'TABLE_A', CASCADE => TRUE);

統計情報を確認してみると確かに更新されています。

TABLE_NAME LAST_ANALYZED_TABLE INDEX_NAME LAST_ANALYZED_INDEX
TABLE_A 2015/09/24 14:09:25 SYS_C0015113 2015/09/24 14:09:25
TABLE_A 2015/09/24 14:09:25 TABLE_A_INDEX99 2015/09/24 14:09:25

統計情報をバックアップからインポートする

ではいよいよ統計情報をバックアップから復元してみます。

まずは既存の統計情報を削除。インデックスの統計情報も削除されます。

SQL> exec dbms_stats.delete_table_stats('USER_HOGE','TABLE_A');

続いてバックアップからインポートします。
cascade オプションを指定している(デフォルトでTRUE)ので、インデックスも復元されます。

SQL> exec DBMS_STATS.IMPORT_TABLE_STATS(ownname => 'USER_HOGE' ,tabname => 'TABLE_A' ,stattab => 'STAT_BACKUP' ,cascade => TRUE);

確認してみると無事に復元されました。
めでたしめでたし。

TABLE_NAME LAST_ANALYZED_TABLE INDEX_NAME LAST_ANALYZED_INDEX
TABLE_A 2015/01/08 22:48:54 SYS_C0015113 2015/01/08 22:48:54
TABLE_A 2015/01/08 22:48:54 TABLE_A_INDEX99 2015/01/08 22:48:55
スポンサーリンク
スポンサーリンク

関連記事

  1. Oracle

    OracleのセッションIDからOSのプロセスIDを調べる方法

    Oracleで障害調査を行いたいときなどに、sidからOSのプロセスI…

  2. Oracle

    【Oracle】一般ユーザーにシステムビューへのアクセス権を付与する方法

    Oracle Databaseで、作成した一般ユーザーからシステムビュ…

  3. Oracle

    【Oracle】統計情報をCronで手動更新する為のスクリプト

    Oracleの統計情報を手動で(といってもCronの自動実行で)更新す…

  4. Oracle

    【Oracle】統計情報のバックアップとリカバリの方法

    Oracleの統計情報をユーザー単位でバックアップする方法と、バックア…

  5. Oracle

    長時間動いているセッション(SQL)の情報を取得するSQL

    Oracleで長時間稼働している処理(SQL)の情報を取得するSQLが…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

最近の記事

  1. yumbackend.pyが終わらない? yumがロックされ…
  2. exportfsコマンド:exportsファイルでのNFSの…
  3. 【Oracleメモ】テーブルやインデックスの統計情報の収集状…
  4. 【CentOS 7】ルーティングの追加と削除の方法
  5. 【NetApp】dateコマンドでシステムの時刻を確認する
PAGE TOP