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で全てのテーブルやインデックスのCreate文を作成する方法

    Oracle で指定したユーザーが所有している全てのテーブルやインデッ…

  2. Oracle

    [TNS-00525: 操作するには権限が不十分です] リスナーが起動できないときの対処方法

    CentOS 6のサーバにOracleを入れたり消したりしていたらリス…

  3. Oracle

    【Oracle】Data Pumpでシーケンスのみを移行する方法

    Data Pumpでは inculde を利用することでシーケンスのみ…

  4. Oracle

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

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

  5. Oracle

    【Oracleメモ】テーブルやインデックスの統計情報の収集状況を確認するSQL

    Oracle11g、Oracl12cなどで利用可能。テーブルやイン…

コメント

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

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

最近の記事

  1. PHP PhantomJSでFatal error: Unc…
  2. 【Oracle】DataPumpの対話式コマンドモードを抜け…
  3. CentOS7のPHP5.6にPhpSpreadsheetを…
  4. Azure仮想マシン(CentOS 7)のStandardデ…
  5. 【CentOS 7】特定ユーザーのクォータ設定を削除(無制限…
PAGE TOP