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) 
);
balanceSTATICであることに注意してください。

手順

単一パーティション・バッチ

  • 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;
    ここでは、同期を保つために同じデータを両方のテーブルに書き込む必要があります。このようなバッチ操作は、ユーザー名とパスワードの更新にもよく使用されます。