cassandra列ファミリーに複数の行を挿入する最も効率的な方法は何ですか。これを単一の呼び出しで行うことは可能ですか?.
現在、私のアプローチは複数の列を追加して実行することです。 1回の呼び出しで、1つの行を保持しています。バッチ挿入ができるように戦略を探しています。
CQLにはBEGIN BATCH...APPLY BATCH
ステートメントにより、複数の挿入をグループ化して、開発者が一連のリクエストを作成および実行できるようにします( http://www.datastax.com/dev/blog/client-side-improvements-in-を参照)。 cassandra-2- )。
以下は私のために働きました(Scala):
PreparedStatement ps = session.prepare(
"BEGIN BATCH" +
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +
"INSERT INTO messages (user_id, msg_id, title, body) VALUES (?, ?, ?, ?);" +
"APPLY BATCH" );
session.execute(ps.bind(uid, mid1, title1, body1, uid, mid2, title2, body2, uid, mid3, title3, body3));
実行するステートメントが事前にわからない場合は、次の構文(Scala)を使用できます。
var statement: PreparedStatement = session.prepare("INSERT INTO people (name,age) VALUES (?,?)")
var boundStatement = new BoundStatement(statement)
val batchStmt = new BatchStatement()
batchStmt.add(boundStatement.bind("User A", "10"))
batchStmt.add(boundStatement.bind("User B", "12"))
session.execute(batchStmt)
注:BatchStatement
は最大65536個のステートメントしか保持できません。私はその難しい方法を学びました。 :-)
PreparedStatementと値のバインドは、より良いオプションかもしれません。以下は、Batchの使用法と誤用に関する優れた記事です。
Cassandraにはバッチ挿入操作があります。異なる列ファミリーでも挿入をバッチ処理して、挿入をより効率的にすることができます。
Hectorでは、_HFactory.createMutator
_を使用してから、返されたMutatorでadd
メソッドを使用して、バッチに操作を追加できます。準備ができたら、execute()
を呼び出します。
CQLを使用している場合は、バッチを_BEGIN BATCH
_で開始し、_APPLY BATCH
_で終了することにより、バッチにグループ化します。
複数の挿入ステートメントをファイルに追加し、「cqlsh -f」を使用してファイルを実行できます。
また、CQLを使用してcassandraに以下のリンクで説明されているようにバッチ挿入を実行することもできます。 http://www.datastax.com/documentation/cassandra/1.2/index.html#cassandra /cql_reference/batch_r.html
複数の行を挿入しようとしたとき。データベース接続RTTは、パフォーマンスのボトルネックになる可能性があります。その場合、通常、次のINSERT
を開始できるように、1つのINSERT
が完了するのを待たないようにする方法が必要です。現在、私が知る限り、2つの方法があります。
LOGGED BATCH
、しかし この質問 が述べたように、BATCH
はすべての状況でパフォーマンスを向上させるとは限りません。execute_async
方法また、SQL文を実行する前に準備できます。準備されたステートメントと単純な挿入の全体的なパフォーマンスをテストしていません。しかし、何千もINSERT
以上あれば、パフォーマンスが向上するはずです。