2

SQL * Loaderの従来のパスについての私の理解は、それがINSERTステートメントを生成し、それらをデータベースに送信するだけであるということです。プログラムでSQLステートメントを生成してデータベースに対して実行するだけでなく、これを使用することでパフォーマンス上の利点はありますか?

4

1 に答える 1

5

SQL * LoaderはINSERTステートメントを生成していますが、非常に重要なことに、バインド変数を使用しています。数千行をロードする場合、文字列リテラルを含むINSERTステートメントの作成は、共有プールのスラッシングに加えて、バインド変数を使用するよりも桁違いに遅くなります。一連のINSERTステートメントを生成する場合、Oracleはすべてのステートメントを解析する必要があります。これにより、ロードプロセスの時間の大部分がすぐに消費されます。共有プールのサイズに応じて、CURSOR_SHARINGパラメータ、およびロードする行数、挿入ステートメントのファイルは、ロードプロセス(および/または同時に実行されている必要がある他の無関係なプロセス)が共有プールに十分な圧力をかけるのを非常に簡単に行うことができます共有プールに十分な連続スペースがないため、新しいクエリを解析します)はエラーになります。

確かに、従来のパスロードに対してSQL*Loaderと同様に動作するアプリケーションを作成できます。アプリケーションは次のようなことをする必要があります

Prepare the statement
Loop
  Read the next row of data
  Split the next row of data into columns
  Bind the data to the bind variables in the prepared statement
  Execute the prepared statement
End loop

これは、データベースに対して何千もの個別のINSERTステートメントを解き放つこととは大きく異なります。

于 2009-08-18T20:53:46.803 に答える