3

現在、OCI を使用して C++ コードからテーブルにレコードを 1 つずつ挿入しています。データは構造体のハッシュマップにあり、マップの要素を繰り返し処理し、構造体の属性をテーブル内のレコードの列にバインドします (例:

挿入クエリを定義する レコードのすべての列に OCIBindByname( ) を使用する マップを反復する 構造体 OCIStmtExecute の属性としてバインド変数を割り当てる end

これはかなり遅いので、一括挿入して高速化したいと思います。これを行う良い方法は何ですか?すべてのレコードを1つのOCIStmtExecuteに挿入するには、構造体の配列を使用する必要がありますか? これを行う方法を示すサンプルコードはありますか?

4

4 に答える 4

2

OCI*MLでこれをどのように実装したかを示すサンプルコードを次に示します。要約すると、これを行う方法は次のとおりです (たとえば、整数の列が 1 つあるテーブルの場合)。

  1. malloc()×行数のメモリのブロックをsizeof(int)作成し、それを移入します。これは配列である可能性があります。
  2. OCIBindByPos()のポインタ*valuepと のサイズで呼び出しますvalue_sz
  3. ステップ 1 の行数に設定しOCIStmtExecute()て呼び出すiters

私の経験では、100 倍の高速化は確実に可能です。

于 2011-11-07T13:18:43.913 に答える
1

おそらくやりたいことは「一括挿入」です。配列への一括挿入は、最初の行のデータを配列の最初の構造体にバインドし、通常は構造体のサイズであるジャンプを設定する ArrayBinds を使用して行われます。この後、配列の数でステートメント実行を行うことができます。複数のバインドによってオーバーヘッドが発生するため、一括挿入が使用されます。

于 2011-10-18T22:06:25.517 に答える