• 締切済み

OracleのIMPについて

Oracle8iからOracle11gへのIMPについて教えてください。 現在、Oracleデータを8iから11gに移す作業を行っているのですが、特定のテーブルのみIMPの時間がかかっています。 4000万件のデータのIMPは1時間くらいで終わりますが特定のテーブルはデータ量が400万件にもかかわらず4時間くらいかかります。 原因等ありますでしょうか? ちなみに、IMPは、 imp XXXX/XXXX@XXXX file=TEST.DMP tables = TESTTABLE log = d:\test.log commit = Y ignore = Y の形式で行っています。

みんなの回答

  • uresiiwa
  • ベストアンサー率45% (49/107)
回答No.2

移行元が8iだからデータパンプは使えないんですね。 impだと時間がかかりますね。 テーブルサイズは、件数で決まるものではなく、「レコード件数×レコード長」なので、 4000万件のテーブルよりも400万件のテーブルのほうがデータ量で上回っていてもおかしくはないです。長大な文字列型を有していたり、列数が非常に多かったりなどすると、やはり時間はかかります。 対策1. 以下のパラメータを追加 recordlength=65535 buffer=20971520 (あと、commit=Nでもいいと思います) 対策2. もしDBがARCHIVE LOGモードであったならば、 インポート前に、DBをNO ARCHIVE LOGモードにし、インポート完了後にARCHIVE LOGモードに戻す。 (REDO書き出しもオーバヘッドになりますので) 他には、当該テーブルに多数(もしくは長大な)インデックスが定義されているか、トリガーが定義されていることが考えられます。 対策3. 当該テーブルのインデックスをDROPしておき、 以下のパラメータを追加してインポート。 indexes=N インポート完了後にcreate indexする。 対策4. (当該テーブルにトリガーが定義されていて、インポート時に起動しなくて良い場合) インポート前に、トリガー無効化 alter table 当該テーブル disable all triggers; インポート後にトリガー有効化 alter table XXXXX enable all triggers; こんなところかなと思います。 あとは、AWRを使ってそれぞれのインポート中の時刻をFROM・TOに指定して、レポーティングすると、何にどれだけ時間がかかったのか分かると思います。AWRはOracle Enterprise Managerから起動できますので、トライしてみると良いです。(Diagnostics Packライセンスが要りますが)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

IMPは基本的に「CREATE TABLE」「CREATE INDEX」してから「INSERT」が実行されます。 INDEXの数が多いと処理時間がかなりかかります。 EXPする際に必要なINDEXの作成情報(DDL)を取得しておいて、 ・INDEX削除 ・テーブル単位でEXP DIRECT=Y を実行 ・IMP (BUFFERサイズを調整 windowsでの最大は不明だが20MBで実行した例があった) http://norainu.net/mt/archives/2005/07/oracleexpimpbuf.html  COMMITはYでいいと思います。 ・データの格納がすんだら「CREATE INDEX」を行う。参考になるのは http://www.insight-tec.com/mailmagazine/ora3/vol186.html alter system set "_pga_max_size"=バイト数;(隠しパラメータ 10g以降で有効かは不明) alter session set workarea_size_policy = MANUAL; alter session set sort_area_size = バイト数;  でINDEX作成セッションのソートメモリを増やして実行。 てな、感じでやってみてはいかがでしょうか?

関連するQ&A