• ベストアンサー

索引の再作成について

Oracle 8iを使用してます。 大量データをDBに登録するのに非常に時間が掛かってしまうためSQL*Loaderを使用しようと思っているのですが、 インデックス作成時に一時領域を多く使用してしまう為、使用出来ないかもしれない状態でおります。 ご教授して頂きたい事は、 (1)一時領域を余り使用せずインデックスの再作成をする手段はありますか。 (2)一時領域を余り使用せず大量データを高速に登録する良い方法はありませんか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

あまり、キチキチの状況で運用しているオラクルを操作しないので、 適切な回答ができませんが、 もしかして、 (1) 索引のREBUILDもままならない。 (2) 大規模問い合わせでエラーになる。 (3) 大量更新できない。 という困った状態なのではないですか? まずは、ディスク増設なり、不要ファイルの整理をするなり、 サーバおよびオラクルを健全(?)な状態にするのが、先決のように 感じます。(でないと、いざというとき何ともならないかと。)

ZAK123
質問者

お礼

お礼が遅くなりました。m(__)m 確かに環境面の整備が必要のようですね。 何か良い方法があるかと思い質問させて頂きました。 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

SINGLEROWオプションを使ったことがないので、マニュアルの記述内容からの推測ですが.. SINGLEROWオプションにより、索引への逐次登録がされるようになり、 その更新に対して、RBSを使わざるおえないのだと思います。 空のテーブルに対して、ダイレクトパスロードするのであれば、 ロード前に、索引をDROPし、ロード後に、再CREATEしても 良いのではないでしょうか。

ZAK123
質問者

お礼

>ロード前に、索引をDROPし、ロード後に、再CREATEしても良いのではないでしょうか。 この方法も考えたのですが、テーブルへの登録は可能なのですが再CREATE時に一時領域が足りなくなってしまうのです。

すると、全ての回答が全文表示されます。
回答No.1

投稿内容からの推測ですが・・ SQL*LOADERのダイレクト・パス・ロードを想定しているのでしょうか? ダイレクト・パス・ロードの場合、インデックスの保守のため、一時領域に一時書き出し、 最後に索引のマージを行います。 従来パスでのSQL*LOADERであれば、一時領域の消費は少ないはずです。 空のテーブルへのロードの場合、ダイレクトパスが最も速いとは思いますが、 空でない場合、従来パスの方が、処理時間的に速いことがあります。 たぶん、条件を満たせる方法としては、従来パスのSQL*LOADERを多重化して、 実施するのが、良いのではないかと想像します。

ZAK123
質問者

お礼

ご回答ありがとうございます。 ご推測の通り、ダイレクト・パス・ロードを想定してます。テーブルは空の状態です。 説明不足で申し訳ありません。 従来型パスで1多重と2多重で測定してみたのですが処理時間に差が出ませんでした。(T_T)

ZAK123
質問者

補足

別の質問になるかもしれませんが・・・ ORACLEマニュアルにダイレクト・パス・ロードをAPPENDで実行する場合、SINGLEROWオプションを使用すると 索引作成の為の一時領域は必要ないと記載がありました。(処理時間は遅くなるみたいですが) 早速試したのですが、下記のエラーが出てしまい回避策が解らずにいます。 ダイレクト・パス・ロードを指定した場合、ロールバック・セグメントは使用されない認識でいたのですが間違いなのでしょうか? ご存知でありましたら、教えて頂けないでしょうかm(__)m <エラー内容>  列配列の構築でブロック・フォーマッタのエラーが発生しました。  ORA-01562:ロールバック・セグメント番号XXを拡張できません。

すると、全ての回答が全文表示されます。

関連するQ&A