STAT_TABLEを使用して統計情報を移行する

Oracle 11gで表のデータは移行せず、統計情報だけを他のデータベースへ移行する方法

マニュアル:https://docs.oracle.com/cd/E16338_01/appdev.112/b56262/d_stats.htm

  1. STAT_TABLEを作成する。下記の例ではSHIOYAMAスキーマ上にSTAT_TABLEという表を作成:
    begin
       DBMS_STATS.CREATE_STAT_TABLE (
          ownname =>'SHIOYAMA',
          stattab =>'STAT_TABLE',
          tblspace =>'USERS');
    end;
    /
  2. STAT_TABLEに統計情報を格納する。下記の例ではテーブル単位で格納:
    begin
       DBMS_STATS.EXPORT_TABLE_STATS (
          ownname => 'SHIOYAMA',   --格納する表が存在するスキーマ名
          tabname => 'TEMP',       --格納する表名
          stattab => 'STAT_TABLE', --格納先STAT_TABLE
          cascade => TRUE);        --表の列と索引の統計情報もエクスポート
    end;
    /
    • 他にも列統計や索引の統計もエクスポート可能。スキーマ単位での移行も可能。
    • もしstattabが別スキーマにある場合、statownでスキーマを指定する。
  3. 作成した統計格納表をエクスポート:
    $ expdp shioyama/XXXXX directory=test_dir tables=stat_table
  4. 邪魔であれば作成した統計格納表を削除:
    begin
       DBMS_STATS.DROP_STAT_TABLE (
           ownname => 'SHIOYAMA',
           stattab => 'STAT_TABLE');
    end;
    /
  5. 統計情報を移したいデータベースへエクスポートした表をインポート:
    $ impdp shioyama/XXXXX directory=test_dir dumpfile=exp.dmp tables=stat_table
  6. バージョンが違う場合は統計格納表をアップグレート:
    exec DBMS_STATS.UPGRADE_STAT_TABLE ('SHIOYAMA', 'STAT_TABLE');
  7. 統計情報のインポート:
    begin
       DBMS_STATS.IMPORT_TABLE_STATS (
          ownname => 'SHIOYAMA',
          tabname => 'TEST',
          stattab => 'STAT_TABLE',
          no_invalidate => FALSE,  --依存カーソルを無効化する
          force => TRUE,           --表の統計情報がロックされていても、統計情報をインポート
          cascade => TRUE);
    end;
    /

追記: STAT_TABLEもデータベースからすると表のひとつなのでUPDATEなどで更新できる。推奨はされていないが、定義が同じ表であれば表名を持つ列を更新して別の表にインポートすることも可能。

以上