

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Keyspaces でバッチステートメントを使用する
<a name="batchStatements"></a>

複数の `INSERT`、`UPDATE`、および `DELETE`オペレーションを `BATCH`ステートメントに結合できます。 `LOGGED`バッチがデフォルトです。

```
batch_statement ::=     BEGIN [ UNLOGGED ] BATCH
                        [ USING update_parameter( AND update_parameter)* ]
                        modification_statement ( ';' modification_statement )*
                        APPLY BATCH
modification_statement ::= insert_statement | update_statement | delete_statement
```

バッチステートメントを実行すると、ドライバーはバッチ内のすべてのステートメントを 1 つのバッチオペレーションに結合します。

使用するバッチオペレーションのタイプを決定するには、次のガイドラインを検討してください。

次の場合は、ログに記録されたバッチを使用します。  
+ アトミックトランザクションの保証が必要です。
+ レイテンシーがわずかに高いことは、許容できるトレードオフです。

ログに記録されていないバッチは、次の場合に使用します。  
+ 単一パーティションオペレーションを最適化する必要があります。
+ ネットワークオーバーヘッドを削減したい。
+ 高スループットの要件があります。

バッチステートメントのクォータの詳細については、「」を参照してください[Amazon Keyspaces (Apache Cassandra 向け) のクォータ](quotas.md)。

## ログに記録されていないバッチ
<a name="batchStatements-unlogged"></a>

**ログに記録されていないバッチ**では、Amazon Keyspaces はバッチログを維持せずに複数のオペレーションを 1 つのリクエストとして処理します。ログに記録されていないバッチオペレーションでは、一部のアクションは成功し、他のアクションは失敗する可能性があります。ログに記録されていないバッチは、次の場合に便利です。
+ 1 つのパーティション内のオペレーションを最適化します。
+ 関連するリクエストをグループ化することで、ネットワークトラフィックを削減します。

ログに記録されていないバッチの構文は、 `UNLOGGED`キーワードを追加したログに記録されているバッチの構文と似ています。

```
BEGIN UNLOGGED BATCH
    INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe');
    INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith');
APPLY BATCH;
```

## ログに記録されたバッチ
<a name="batchStatements-logged"></a>

**ログに記録された**バッチは、複数の書き込みアクションを 1 つのアトミックオペレーションに結合します。ログに記録されたバッチを実行する場合:
+ すべてのアクションは一緒に成功するか、一緒に失敗します。
+ オペレーションは同期的でべき等です。
+ 同じ AWS アカウントと にある限り、複数の Amazon Keyspaces テーブルに書き込むことができます AWS リージョン。

ログに記録されたバッチのレイテンシーはわずかに長くなる場合があります。高スループットアプリケーションの場合は、ログに記録されていないバッチの使用を検討してください。

Amazon Keyspaces でログに記録されたバッチを使用するための追加コストはありません。バッチオペレーションの一部である書き込みに対してのみ料金が発生します。Amazon Keyspaces は、バッチ内のすべての行に対して 2 つの基盤となる書き込みを実行します。1 つはバッチの行を準備するため、もう 1 つはバッチをコミットするためです。ログに記録されたバッチを使用するテーブルの容量を計画する場合、バッチの各行には標準の書き込みオペレーションの 2 倍の容量が必要であることに注意してください。たとえば、アプリケーションが 1 秒あたり 1 つのログに記録されたバッチを 3 つの 1KB 行で実行する場合、6 つの書き込みキャパシティーユニット (WCUs) をプロビジョニングする必要があります。これに対して、個々の書き込みまたはログに記録されていないバッチでは 3 WCUs のみプロビジョニングする必要があります。

料金については、「[Amazon Keyspaces (for Apache Cassandra) pricing (Amazon Keyspaces (Apache Cassandra 向け) の料金)](https://aws.amazon.com/keyspaces/pricing)」を参照してください。

### バッチオペレーションのベストプラクティス
<a name="batchStatements-best-practice"></a>

Amazon Keyspaces バッチオペレーションを使用する場合は、次の推奨プラクティスを検討してください。
+ 自動スケーリングを有効にすると、テーブルがバッチオペレーションとログに記録されたバッチの追加スループット要件を処理するのに十分なスループット容量を確保できます。
+ アプリケーションの正確性に影響を与えることなくオペレーションを個別に実行できる場合は、個々のオペレーションまたはログに記録されていないバッチを使用します。
+ 同時バッチ操作は競合して失敗する可能性があるため、同じ行への同時更新を最小限に抑えるようにアプリケーションを設計します。
+ アトミック性要件のない高スループットのバルクデータ取り込みの場合は、個々の書き込みオペレーションまたはログに記録されていないバッチを使用します。

### 整合性と同時実行性
<a name="batchStatements-consistency"></a>

Amazon Keyspaces では、ログに記録されたバッチに対して次の整合性と同時実行ルールが適用されます。
+ すべてのバッチオペレーションは`LOCAL_QUORUM`整合性レベルを使用します。
+ 異なる行に影響する同時バッチは、同時に実行できます。
+ 進行中のバッチに関係する行に対する同時 `INSERT`、`UPDATE`、または `DELETE`オペレーションは、競合で失敗します。

### サポートされている演算子と条件
<a name="batchStatements-operators"></a>

サポートされている`WHERE`句演算子:  
+ 等価 (=)

サポートされていない演算子:  
+ 範囲演算子 (>、＜、>=、<=)
+ `IN` operator
+ `LIKE` operator
+ `BETWEEN` operator

ログに記録されたバッチではサポートされていません。  
+ 同じ行に影響する複数のステートメント
+ カウンターオペレーション
+ 範囲の削除

### ログに記録されたバッチステートメントの障害条件
<a name="batchStatement-failures"></a>

ログに記録されたバッチオペレーションは、次のいずれかのケースで失敗することがあります。
+ 条件式 ( `IF NOT EXISTS`や など`IF`) は false に評価されます。
+ 1 つ以上のオペレーションに無効なパラメータが含まれています。
+ リクエストは、同じ行で実行されている別のバッチオペレーションと競合します。
+ テーブルに十分なプロビジョニングされた容量がありません。
+ 行が最大サイズ制限を超えています。
+ 入力データ形式が無効です。

### バッチステートメントとマルチリージョンレプリケーション
<a name="batchStatements-multiregion"></a>

マルチリージョンデプロイの場合:
+ ソースリージョンオペレーションは同期およびアトミックです。
+ 送信先リージョンオペレーションは非同期です。
+ すべてのバッチオペレーションはレプリケート先リージョンにレプリケートされますが、アプリケーション中に分離を維持できない場合があります。

### バッチオペレーションのモニタリング
<a name="batchStatements-monitoring"></a>

Amazon CloudWatch メトリクスを使用してバッチオペレーションをモニタリングし、パフォーマンス、エラー、使用パターンを追跡できます。Amazon Keyspaces には、テーブルごとにバッチオペレーションをモニタリングするための以下の CloudWatch メトリクスが用意されています。
+ `SuccessfulRequestCount` – バッチオペレーションの成功を追跡します。
+ `Latency` – バッチオペレーションのパフォーマンスを測定します。
+ `ConsumedWriteCapacityUnits` – バッチオペレーションの容量消費をモニタリングします。

詳細については、「[Amazon Keyspaces のメトリクス](metrics-dimensions.md#keyspaces-metrics-dimensions)」を参照してください。

CloudWatch メトリクスに加えて、 を使用してすべての Amazon Keyspaces API アクション AWS CloudTrail をログに記録できます。バッチ内の各 API アクションは CloudTrail に記録されるため、Amazon Keyspaces テーブルのバッチオペレーションの追跡と監査が容易になります。

### バッチオペレーションの例
<a name="batchStatements-examples"></a>

以下は、ログに記録される基本的なバッチステートメントの例です。

```
BEGIN BATCH
    INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe');
    INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith');
APPLY BATCH;
```

これは、、`INSERT`、`UPDATE`および `DELETE`ステートメントを含むバッチの例です。

```
BEGIN BATCH
    INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe');
    UPDATE users SET firstname = 'Johnny' WHERE id = 2;
    DELETE FROM users WHERE id = 3;
APPLY BATCH;
```

これは、クライアント側のタイムスタンプを使用したバッチの例です。

```
BEGIN BATCH
    INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Stiles') USING TIMESTAMP 1669069624;
    INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Doe') USING TIMESTAMP 1669069624;
APPLY BATCH;

BEGIN BATCH
    UPDATE users USING TIMESTAMP 1669069624 SET firstname = 'Carlos' WHERE id = 1;
    UPDATE users USING TIMESTAMP 1669069624 SET firstname = 'Diego' WHERE id = 2;
APPLY BATCH;
```

これは条件付きバッチの例です。

```
BEGIN BATCH
    INSERT INTO users (id, firstname, lastname) VALUES (1, 'Jane', 'Doe') IF NOT EXISTS;
    INSERT INTO users (id, firstname, lastname) VALUES (2, 'John', 'Doe') IF NOT EXISTS;
APPLY BATCH;


BEGIN BATCH
    UPDATE users SET lastname = 'Stiles' WHERE id = 1 IF lastname = 'Doe';
    UPDATE users SET lastname = 'Stiles' WHERE id = 2 IF lastname = 'Doe';
APPLY BATCH;
```

これは、有効期限 (TTL) を使用するバッチの例です。

```
BEGIN BATCH
    INSERT INTO users (id, firstname, lastname) VALUES (1, 'John', 'Doe') USING TTL 3600;
    INSERT INTO users (id, firstname, lastname) VALUES (2, 'Jane', 'Smith') USING TTL 7200;
APPLY BATCH;
```

これは、複数のテーブルを更新するバッチステートメントの例です。

```
BEGIN BATCH
    INSERT INTO users (id, firstname) VALUES (1, 'John');
    INSERT INTO user_emails (user_id, email) VALUES (1, 'john@example.com');
APPLY BATCH;
```

これは、ユーザー定義タイプ (UDTs。この例では、UDT `address`が存在することを前提としています。

```
BEGIN BATCH
    INSERT INTO users (id, firstname, address)
    VALUES (1, 'John', {street: '123 Main St', city: 'NYC', zip: '10001'});
    INSERT INTO users (id, firstname, address)
    VALUES (2, 'Jane', {street: '456 Oak Ave', city: 'LA', zip: '90210'});
APPLY BATCH;

BEGIN BATCH
    UPDATE users SET address.zip = '10002' WHERE id = 1;
    UPDATE users SET address.city = 'Boston' WHERE id = 2;
APPLY BATCH;
```