■ impdp&expdp
Oracleの本番環境からexpdpで取得したdmpファイルを、開発環境にimpdpでインポート。さらに開発環境からexpdpでダンプファイルを取得という操作を行っていました。
作業終了後、開発環境の使用を再開したのですが、異様に処理が遅い。何だろうと思って色々と調べてみると、開発環境の統計情報がどうやら壊れている気配です。
何をもって壊れていると言えるのか分かりませんが、PrimaryKeyだけを条件とするSELECT文の実行計画が全く関係ないインデックスを使っているので、統計情報が変になっているのは間違いないと思います。
なお、環境は
Oracle11gです。
■ 統計情報の取得(テーブル)
そもそも、統計情報の取得は手動にしていたという認識だったのですが、USER_TABLESを引っこ抜いてLAST_ANALYZEDを確認すると、impdpを実行した辺りの日付情報が設定されていました。ふむ、動的に変わるようになっていたんですね。
とりあえず、統計情報が変だという想定のもとに1テーブルだけ統計情報を再取得してみます。
スキーマ:HARIKOFU、テーブル:TERA に対して統計情報の再取得を実行します。
-- テーブル単位の取得EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'HARIKOFU', TABNAME => 'TERA');
処理は、SQL*Plusから実行です。
処理の終了後、TERAテーブルをPrimaryKeyで検索すると、きちんとPrimaryKeyを使用する実行計画になっていました。
■ 統計情報の取得(スキーマ)
これに気を良くして、スキーマ全体の統計情報取得を実行します。構文はさっきとほぼ同じですが、OPTIONS何たらの部分がちょっと変わります。
-- スキーマ単位の統計情報の取得EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS (OWNNAME => 'HARIKOFU', OPTIONS => 'GATHER');
この辺りの処理の詳細は
Oracleのマニュアルに書いてあったのですが、色々とオプションを設定できるようです。ようですが、サラッと見た感じ、特に付ける必要があるオプションがなさそうな感じ。
例えば、OPTIONS => 'GATHER' とした部分は、スキーマ内のすべてのオブジェクトに関する統計情報を収集するという定義です。他に6つほど選択肢があるようですが、何のために設定するのか良く分かりませんでしたので、まぁ、これで良いでしょう。
■ 余談
統計情報の取得日時は、テーブルは「USER_TABLES」、インデックスは「USER_INDEXES」のLAST_ANALYZEDから取得できました。
テーブルなら、こんなSQLで確認出来ます。
SELECT TABLE_NAME NAME
,LAST_ANALYZED
FROM USER_TABLES
ところで、SQL*PlusでEXECUTEを実行する時って改行出来ないんでしたっけ?
テキストエディタに下記のように記述して、それをコピペでSQL*Plusに貼り付けて実行したのですが、1行目の部分で処理が実行された感じになって上手く行きませんでした。
-- テキストエディタに書いた文
EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS (
OWNNAME => 'HARIKOFU'
,OPTIONS => 'GATHER');
普段、Object Browser とか使っているから、SQL*Plusを使おうとするとちょっと戸惑っちゃいます。
■ 後書き
本番環境から開発環境にデータを移すまでは良くあるでしょうが、その直後に開発環境から引っこ抜くのは何でだろうと思った方もいるかと思います。
かなり迂遠なことをやっているのは事実ですが、本番環境のストレージの容量が足りないので、他に良い手段が思いつかなかったのです。
つまり、本番環境ではexpdpをテーブル単位に実行。作成したdmpファイルを開発環境にコピー。んで、本番環境でexpdpで別のテーブルを取得・・・という処理を繰り返しました。
んで、開発環境には十分な容量があったので、impdpで登録後にexpdpでスキーマ全体のdmpファイルを取得した訳です。
最新の記事:
http://harikofu.blog.fc2.com/投稿記事の一覧:
http://harikofu.web.fc2.com/--- blog end ---
スポンサードリンク