Quelle est la manière la plus efficace d'insérer plusieurs lignes dans la famille de colonnes cassandra. Est-il possible de le faire en un seul appel.
À l'heure actuelle, mon approche consiste à ajouter plusieurs colonnes, puis à exécuter. Là, dans un seul appel, je persiste une rangée. Je recherche une stratégie pour pouvoir faire un insert batch.
CQL contient un BEGIN BATCH...APPLY BATCH
instruction qui vous permet de regrouper plusieurs insertions afin qu'un développeur puisse créer et exécuter une série de demandes (voir http://www.datastax.com/dev/blog/client-side-improvements-in- cassandra-2- ).
Ce qui suit a fonctionné pour moi (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));
Si vous ne savez pas à l'avance quelles instructions vous souhaitez exécuter, vous pouvez utiliser la syntaxe suivante (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)
Remarque: BatchStatement
ne peut contenir que 65536 instructions. J'ai appris ça à la dure. :-)
PreparedStatement et les valeurs de liaison peuvent être une meilleure option. Vous trouverez ci-dessous quelques bons articles sur les utilisations et les abus de Batch:
Il y a une opération d'insertion par lots dans Cassandra. Vous pouvez regrouper des insertions, même dans différentes familles de colonnes, pour rendre l'insertion plus efficace.
Dans Hector, vous pouvez utiliser HFactory.createMutator
Puis utiliser les méthodes add
sur le mutateur renvoyé pour ajouter des opérations à votre lot. Lorsque vous êtes prêt, appelez execute()
.
Si vous utilisez CQL, vous regroupez les choses dans un lot en commençant le lot par BEGIN BATCH
Et en terminant par APPLY BATCH
.
vous pouvez ajouter vos multiples instructions d'insertion dans un fichier et exécuter le fichier avec 'cqlsh -f'.
Vous pouvez également effectuer une insertion par lots avec CQL dans cassandra comme décrit dans le lien ci-dessous: http://www.datastax.com/documentation/cassandra/1.2/index.html#cassandra /cql_reference/batch_r.html
Lorsque vous essayez d'insérer plusieurs lignes. La connexion à la base de données RTT pourrait être le goulot d'étranglement des performances. Dans ce cas, nous avons généralement besoin d'un moyen pour éviter d'attendre la fin d'un INSERT
afin de pouvoir commencer notre prochain INSERT
. Actuellement, il y a deux façons pour autant que je sache:
LOGGED BATCH
, mais comme cette question l'a dit, BATCH
peut ne pas avoir une amélioration des performances dans toutes les situations.execute_async
méthodeVous pouvez également préparer l'instruction SQL avant de l'exécuter. Je n'ai pas testé les performances globales d'une instruction préparée par rapport à un insert simple. Mais je pense que s'il y a des milliers INSERT
ou plus, vous devriez obtenir une amélioration des performances.