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;

    カラムが静的であるため、データの更新時はパーティション・キーのみを指定できます。静的ではないカラムを更新する場合は、クラスター化キーも指定する必要があります。バッチ処理された条件付き更新を使用すると、現時点までの合計額を維持できます。条件付き更新があるバッチは複数のパーティションにまたがることができないため、合計額を別個のテーブルに格納すると現時点までの合計額を維持できなくなります。

複数のパーティションのログに記録されるバッチ
  • もう1つの例では、同期する必要がある、同一データの2つの関連テーブルへの書き込みに関係するBATCHを使用した複数のパーティションの挿入を実行します。以下の例では複数のパーティションを変更します。通常は避けるべき操作で、バッチには2つの文のみが含まれます。
    BEGIN 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;
    このようなバッチ操作は、ユーザー名とパスワードの更新にもよく使用されます。