BATCH文の使用
BATCH文の使用法。
バッチ処理には長所も短所もあります。以下の例は、BATCH
の適切な使用法と誤った使用法を示しています。
手順
-
ログに記録された適切なバッチの例。cyclist_expensesのテーブル定義に注意してください。balanceカラムは
STATIC
です。cqlsh> CREATE TABLE cycling.cyclist_expenses ( cyclist_name text, balance float STATIC, expense_id int, amount float, description text, paid boolean, PRIMARY KEY (cyclist_name, expense_id) );
-
BATCH
文の最初のINSERTはbalanceをゼロに設定します。次の2つの文はexpenseを挿入し、balance値を変更します。このバッチのINSERT
文とUPDATE
文がすべて同じパーティションに書き込まれ、書き込み操作のレイテンシーを低く保ちます。cqlsh> BEGIN BATCH INSERT INTO cycling.cyclist_expenses (cyclist_name, balance) VALUES ('Vera ADRIAN', 0) IF NOT EXISTS; INSERT INTO cycling.cyclist_expenses (cyclist_name, expense_id, amount, description, paid) VALUES ('Vera ADRIAN', 1, 7.95, 'Breakfast', false); APPLY BATCH;
BATCH文リファレンスで説明したように、Cassandra 2.0.6以降では、条件付き更新をバッチ処理できます。以下の例は、静的カラムの使用を組み合わせた条件付き更新のバッチ処理を示しています。
注: 合計額のUPDATEが以下のBATCH文に含まれると予測できます。
ただし、cqlsh> UPDATE cycling.cyclist_expenses SET balance = -7.95 WHERE cyclist_name = 'Vera ADRIAN' IF balance = 0;
BATCH
文内で処理されるすべての文は、記録でタイムスタンプに同じ値が使用されることを理解することが重要です。処理は、BATCH
文にリストされた順に実行されない場合があります。UPDATEは、最初のINSERTの前に処理される可能性があり、合計額の値をゼロに設定して、条件を満たします。バッチ処理が正常に実行されると、バッチ文の確認応答が返されます。
最終的なテーブルには1つの記録のみが表示されます。
-
合計額はUPDATE文を使用して別途調整できます。これでbalanceには朝食が未払いであることが反映されます。
cqlsh> UPDATE cycling.cyclist_expenses SET balance = -7.95 WHERE cyclist_name = 'Vera ADRIAN' IF balance = 0;
-
cyclist_expenses テーブルには、サイクリストによる各購入に関する記録が格納され、サイクリストの全購入の現時点までの合計額が含められます。合計額が静的であるため、サイクリストのすべての購入記録が現時点までの同じ合計額になります。以下の
BATCH
文では、さらに2つの食事が挿入されて合計額が変更され、朝食とディナーが未払いであることが反映されます。cqlsh> BEGIN BATCH INSERT INTO cycling.cyclist_expenses (cyclist_name, expense_id, amount, description, paid) VALUES ('Vera ADRIAN', 2, 13.44, 'Lunch', true); INSERT INTO cycling.cyclist_expenses (cyclist_name, expense_id, amount, description, paid) VALUES ('Vera ADRIAN', 3, 25.00, 'Dinner', false); UPDATE cycling.cyclist_expenses SET balance = -32.95 WHERE cyclist_name = 'Vera ADRIAN' IF balance = -7.95; APPLY BATCH;
-
最後に、サイクリストはすべての未払勘定を支払い、口座のbalanceはゼロになります。
caqlsh> BEGIN BATCH UPDATE cycling.cyclist_expenses SET balance = 0 WHERE cyclist_name = 'Vera ADRIAN' IF balance = -32.95; UPDATE cycling.cyclist_expenses SET paid = true WHERE cyclist_name = 'Vera ADRIAN' AND expense_id = 1 IF paid = false; UPDATE cycling.cyclist_expenses SET paid = true WHERE cyclist_name = 'Vera ADRIAN' AND expense_id = 3 IF paid = false; APPLY BATCH;
カラムが静的であるため、データの更新時はパーティション・キーのみを指定できます。静的ではないカラムを更新する場合は、クラスター化キーも指定する必要があります。バッチ処理された条件付き更新を使用すると、現時点までの合計額を維持できます。条件付き更新があるバッチは複数のパーティションにまたがることができないため、合計額を別個のテーブルに格納すると現時点までの合計額を維持できなくなります。