2017-03-06 4 views
0

約250万の挿入文を持つoracleに挿入スクリプトファイルがあります。 Oracle表に挿入するためのアイデアが必要です。約250万の挿入文を使用してoracleで挿入スクリプトファイルを実行するにはどうすればよいですか?

ファイルを直接実行すると、SQL Developerを使用して挿入しようとしました@path\script.sql。しかし、それはタイムアウトします。

+2

2,5million **個** INSERT文???タイムアウトの問題に直面していますか?想像してみてください! – APC

+0

挿入文はどこから来たのですか?おそらく彼らは手で書かれていなかったでしょう。 – APC

+0

そのエクスポートは、別のテーブルにそれらのレコードを挿入しようとしています。 – ashwinsakthi

答えて

2

250万の個々のINSERT文は、常に吸うために起こっている:あなたはバルクデータボリューム用に適しものを使用する必要が

「輸出、別のテーブルにこれらのレコードを挿入しようとしています」

ベスト・アプローチは、エクスポートを別の形式、たとえばdatadumpを使用してやり直すことです。

また、@thatjeffsmithが示唆しているように、レコードをCSV形式でエクスポートしてSQL * Loaderを使用してインポートすることもできます。

SQL Developerには、これを支援するオプションがあります。

+0

サーバー/データ・パックへのアクセス権を持たない開発者であれば、SQL * Loaderを試すこともできます。 – thatjeffsmith

-1

これらのレコードがきれいであると仮定して、挿入するテーブルのログとインデックスを無効にすることができます。また、私は1000レコード後またはあなたの要求ごとにコミットを行うだろう。

+0

100.000インサートでアプローチをテストし、アドバイスを確認してください。 –

0

最後の手段として、スクリプトごとにINSERTの部分を削除し、値をcsv形式のままにしておきます。

EXTERNAL TABLEを定義するか、これは1回限りのスクリプトであればSQL*Loader

0

でそれをロードし、ファイルに複数のBEGINEND; /を追加することにより、匿名のPL/SQLブロックに手動でグループのステートメントをするために数分を費やしています。このファイルを常に再生成しない限り、別の形式やツールを使用する必要はありません。

多くのステートメントを持つスクリプトは、ネットワーク遅延のために通常遅いです。各ステートメントはサーバーに送信され、実行され、状態が返されます。同じホスト上で実行している場合でも、通信オーバヘッドは実際の作業を実行するために使用された時間を超えることがあります。

PL/SQLブロックは、単一のユニットとしてサーバーに送信されます。一度に100文のブロックを送信すると、ネットワークオーバーヘッドが99%削減されます。 1000,10000などのブロックを使用することで大幅な改善は見られませんが、ブロックが大きくなればなるほど手作業による編集が少なくて済みます。しかし、ブロックがでもであれば、それはコンパイル制限を超えてエラーをスローします。

関連する問題