STAT_TABLEを使用して統計情報を移行する
Oracle 11gで表のデータは移行せず、統計情報だけを他のデータベースへ移行する方法
マニュアル:https://docs.oracle.com/cd/E16338_01/appdev.112/b56262/d_stats.htm
- STAT_TABLEを作成する。下記の例ではSHIOYAMAスキーマ上にSTAT_TABLEという表を作成:
begin DBMS_STATS.CREATE_STAT_TABLE ( ownname =>'SHIOYAMA', stattab =>'STAT_TABLE', tblspace =>'USERS'); end; /
- STAT_TABLEに統計情報を格納する。下記の例ではテーブル単位で格納:
begin DBMS_STATS.EXPORT_TABLE_STATS ( ownname => 'SHIOYAMA', --格納する表が存在するスキーマ名 tabname => 'TEMP', --格納する表名 stattab => 'STAT_TABLE', --格納先STAT_TABLE cascade => TRUE); --表の列と索引の統計情報もエクスポート end; /
- 作成した統計格納表をエクスポート:
$ expdp shioyama/XXXXX directory=test_dir tables=stat_table
- 邪魔であれば作成した統計格納表を削除:
begin DBMS_STATS.DROP_STAT_TABLE ( ownname => 'SHIOYAMA', stattab => 'STAT_TABLE'); end; /
- 統計情報を移したいデータベースへエクスポートした表をインポート:
$ impdp shioyama/XXXXX directory=test_dir dumpfile=exp.dmp tables=stat_table
- バージョンが違う場合は統計格納表をアップグレート:
exec DBMS_STATS.UPGRADE_STAT_TABLE ('SHIOYAMA', 'STAT_TABLE');
- 統計情報のインポート:
begin DBMS_STATS.IMPORT_TABLE_STATS ( ownname => 'SHIOYAMA', tabname => 'TEST', stattab => 'STAT_TABLE', no_invalidate => FALSE, --依存カーソルを無効化する force => TRUE, --表の統計情報がロックされていても、統計情報をインポート cascade => TRUE); end; /
追記: STAT_TABLEもデータベースからすると表のひとつなのでUPDATEなどで更新できる。推奨はされていないが、定義が同じ表であれば表名を持つ列を更新して別の表にインポートすることも可能。
以上