BATCH文の適切な使用法
BATCH文の使用法。
バッチ操作が有効な場合があります。以下の例は、
BATCH
の適切な使用法を示しています。以下の例では、次のcyclist_expensesテーブルを使用します。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) );
balance
がSTATIC
であることに注意してください。手順
単一パーティション・バッチ
-
BATCH
文の最初のINSERTはbalance
を0に設定します。次の2つの文はexpense_id
を挿入し、balance
値を変更します。このバッチのINSERT
文とUPDATE
文がすべて同じパーティションに書き込まれ、書き込み操作のレイテンシーを低く保ちます。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;
以下のバッチ処理の例には、静的カラムの使用を組み合わせた条件付き更新が含まれています。単一パーティション・バッチはログに記録されないことを思い出してください。
注: 合計額のUPDATEが以下のBATCH文に含まれると予測できます。UPDATE cycling.cyclist_expenses SET balance = -7.95 WHERE cyclist_name = 'Vera ADRIAN' IF balance = 0;
ただし、BATCH
文内で処理されるすべての文は、レコードでタイムスタンプに同じ値が使用されることを理解することが重要です。処理は、BATCH
文にリストされた順に実行されない場合があります。UPDATEは、最初のINSERTの前に処理される可能性があり、合計額の値を0に設定して、条件を満たします。バッチ操作が正常に実行されると、バッチ文の確認応答が返されます。最終的なテーブルにはレコードが1つだけ表示されます。
-
合計額はUPDATE文を使用して別途調整できます。これで
balance
には朝食が未払いであることが反映されます。UPDATE cycling.cyclist_expenses SET balance = -7.95 WHERE cyclist_name = 'Vera ADRIAN' IF balance = 0;
-
cyclist_expensesテーブルには、サイクリストの各購入に関するレコードが格納され、サイクリストの全購入の現時点までの合計額が含まれます。合計額が静的であるため、サイクリストのすべての購入記録が現時点までの同じ合計額になります。以下の
BATCH
文では、さらに2つの食事が挿入されて合計額が変更され、朝食とディナーが未払いであることが反映されます。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は0になります。
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;
カラムが静的であるため、データの更新時はパーティション・キーのみを指定できます。静的ではないカラムを更新する場合は、クラスター化キーも指定する必要があります。バッチ処理された条件付き更新を使用すると、現時点までの合計額を維持できます。条件付き更新があるバッチは複数のパーティションにまたがることができないため、合計額を別個のテーブルに格納すると現時点までの合計額を維持できなくなります。
複数のパーティションのログに記録されるバッチ
-
複数のパーティションの挿入に
BATCH
を使用する典型的な例として、同じデータを2つの関連テーブルに書き込む操作があります。BEGIN LOGGED BATCH INSERT INTO cycling.cyclist_names (cyclist_name, race_id) VALUES ('Vera ADRIAN', 100); INSERT INTO cycling.cyclist_by_id (race_id, cyclist_name) VALUES (100, 'Vera ADRIAN'); APPLY BATCH;
ここでは、同期を保つために同じデータを両方のテーブルに書き込む必要があります。このようなバッチ操作は、ユーザー名とパスワードの更新にもよく使用されます。