現在、同じテーブルで(起動時ではなく)多数の挿入を実行する必要があるモデルがあります。とりあえず、C ++コード内に設定された挿入値を準備してから、挿入ストアドプロシージャを個別に呼び出します。
例えば
INSERT ... VALUES ('1','2')
INSERT ... VALUES ('3','4')
INSERT ... VALUES ('5','6')
(VoltDBとC ++クライアントを使用して)次のいずれかが可能かどうかを知りたいです。
1)バルクインサートを行います。
INSERT ... VALUES ('1','2'), ('3','4'), ('5','6')
または
2)カスタム区切り文字を含む配列または文字列をストアドプロシージャに渡し、それを内部で解析して、ストアドプロシージャ自体の内部で個々の挿入を呼び出します。
INSERT ... VALUES ('1,2|3,4|5,6') or similar
次に、プロシージャ内で文字列を分割します。
どちらかが可能であれば、例、または実装を容易にするC ++ API構文のいずれかを教えてください。(たとえば、文字列および/または文字列操作関数を解析するためのストアドプロシージャのループなど)
相対的なパフォーマンスをテストするために、これらのオプションの1つを試してみたいと思います。個々の挿入は十分に高速である必要があることを読みましたが、これはユースケースによって異なる可能性があると思います。
テーブルのデフォルトの挿入プロシージャを呼び出すと、個々の挿入が高速になります。たとえば、「TABLENAME .insert」は、INSERT ... VALUESと同じ値を取りますが、AdHoc SQLパーサーをバイパスし、パーティションに直接ルーティングされます。これにより、行ごとに個別のプロシージャ呼び出しを使用してレコードを挿入するのに最高のパフォーマンスが得られます。
Javaクライアントには、テーブルの一括読み込みを容易にするAPIがあります。ここにサンプルチュートリアルがあります:https://github.com/VoltDB/voltdb/tree/master/examples/HOWTOs/bulkloader
データがCSVまたは区切りファイルに存在する場合は、同じバルクローダーAPIを使用するcsvloaderアプリケーションを利用できます。
C ++クライアントにはバルクローダーAPIの実装がないため、不可能ではありませんが、はるかに困難になります。
INSERT ... VALUES( '1'、 '2')、( '3'、 '4')、...の形式の一括挿入は、VoltDBではサポートされていません。
あなたが説明する他のアプローチが可能です。VoltTableを入力パラメーターとして受け取るJavaストアドプロシージャを記述し、C ++クライアントからJavaのVoltTableに対応するTableオブジェクトを作成できます。または、値の配列を渡すこともできます。ただし、VoltTableも配列も、プロシージャーのパーティション化キー・パラメーターにすることはできません。したがって、大規模な処理を実行しようとしている場合は、パーティションキーに個別のパラメーター値を設定する必要があり、すべて同じパーティションに属するレコードのセットを送信する必要があります。それは難しいかもしれません。最も簡単な方法は、独自の単純なハッシュ関数を作成することです。新しいレコードを生成または受信するときに、関数でそれらをハッシュしてバケットにグループ化し、これらのレコードのセットをデータベースにまとめて送信できます。パーティションキーとしてハッシュ値を使用します。ただし、このハッシュ値の列をテーブルに含める必要があります。したがって、同じハッシュ値を持つレコードは同じパーティションに属します。
開示:私はVoltDBで働いています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加