3

私がこれから着手しようとしていることについて、誰かが経験を持っているかどうか疑問に思っていました. サイズが約1 GB程度のcsvファイルがいくつかあり、それらをOracleデータベースにロードする必要があります。ロード後の私の作業のほとんどは読み取り専用になりますが、時々更新をロードする必要があります。基本的に、データベースまで一度に複数行のデータをロードするための優れたツールが必要です。

これが私がこれまでに見つけたものです:

  1. SQL Loader を使用して多くの作業を行うことができました

  2. Bulk-Insert コマンドを使用できます

  3. ある種のバッチ挿入。

どういうわけか準備済みステートメントを使用することは良い考えかもしれません。私は、この挿入物を完成させるための最速の方法は何だと誰もが考えているのだろうと思っていたと思います. 任意のヒント?

4

3 に答える 3

5

SQL*Loader Direct Path Loadsよりも優れた独自のユーティリティを作成できるとしたら、私は非常に驚かれることでしょう。オラクルはまさにこの目的のためにこのユーティリティを構築しました。より効率的なものを構築する可能性は事実上ゼロです。Parallel Direct Path Loadもあります。これにより、複数のダイレクト パス ロード プロセスを同時に実行できます。

マニュアルから:

ダイレクト パス ロードは、SQL INSERT ステートメントを使用してバインド配列バッファーを埋めて Oracle データベースに渡す代わりに、ダイレクト パス API を使用して、ロードするデータをサーバーのロード エンジンに渡します。ロード エンジンは、渡されたデータから列配列構造を構築します。

ダイレクト パス ロード エンジンは、列配列構造を使用して Oracle データ ブロックをフォーマットし、インデックス キーを作成します。新しくフォーマットされたデータベース ブロックは、データベースに直接書き込まれます (ホスト プラットフォームが非同期 I/O をサポートしている場合は、非同期書き込みを使用して I/O 要求ごとに複数のブロック)。

内部的には、フォーマットされたブロックに複数のバッファが使用されます。ホスト プラットフォームで非同期 I/O が使用可能な場合、1 つのバッファーがいっぱいになると、1 つ以上のバッファーが書き込まれます。計算を I/O とオーバーラップさせると、ロード パフォーマンスが向上します。

Direct Path Loadが使用できない場合があります。

于 2010-06-07T21:18:44.483 に答える
0

その量のデータでは、バッキング ストア (dbf ディスクの空き領域) を確認する必要があります。

sqlldr はスクリプト ドライブであり、非常に効率的で、一般的に SQL スクリプトよりも効率的です。唯一気になるのは、データの規模です。個人的には、いくつかから多数の sqlldr プロセスを検討し、それぞれにデータのサブセットを割り当てて、プロセスを並行して実行させます。

一度にいくつかのレコードをロードしたいとおっしゃいましたか? それには、あなたが思っているよりもずっと時間がかかるかもしれません。一度にいくつかのファイルを意味していましたか?

于 2010-06-07T19:32:43.890 に答える
0

CSV ファイルで外部テーブルを作成し、外部テーブルから別のテーブルに SELECT することでそれらをロードできる場合があります。この方法がより速くなるかどうかは定かではありませんが、特に UPDATE の基準がある場合に sql*loader を動作させるという点でより速くなる可能性があります。

于 2010-06-08T07:16:54.107 に答える