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メモ】テーブルやインデックスの統計情報の収集状況を確認するSQL

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

  2. Oracle

    impdpでインデックスのみを作成する方法

    impdpを利用してインデックスのみを作成したかったのでメモ的に。…

  3. Oracle

    SQLチューニングアドバイザを使用するために必要な権限

    OracleでSQLチューニングアドバイザ(EEライセンス)を利用する…

  4. Linux

    LinuxカーネルパラメータSEMMNSとSEMMSLの値を確認する方法

    OracleでPROCESSESパラメータの値を変更する際には、OSカ…

コメント

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

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

最近の記事

  1. expdpが「すでに使用されているオブジェクト名です」と失敗…
  2. VMware Server 1系(Linux)のバージョンを…
  3. 【NetApp】AutoSupportMailの宛先を変更す…
  4. Mattermostを開くと502エラーが表示される時
  5. 【CentOS 7+Firewalld】FTPサーバへパッシ…
PAGE TOP