

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 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
```

运行批处理语句时，驱动程序会将批处理中的所有语句合并为一个批处理操作。

要决定使用哪种类型的批量操作，可以考虑以下准则。

在以下情况下使用已记录的批次：  
+ 你需要原子交易保障。
+ 稍高的延迟是可以接受的权衡取舍。

在以下情况下使用未记录的批次：  
+ 您需要优化单分区操作。
+ 您想减少网络开销。
+ 您有高吞吐量要求。

有关批处理语句配额的信息，请参见[Amazon Keyspaces（Apache Cassandra 兼容）限额](quotas.md)。

## 未记录的批次
<a name="batchStatements-unlogged"></a>

对于**未记录的批处理**，Amazon Keyspaces 可以将多个操作作为单个请求处理，而无需维护批处理日志。在未记录的批处理操作中，有些操作可能会成功，而另一些操作则失败。当您想执行以下操作时，未记录的批次非常有用：
+ 优化单个分区内的操作。
+ 通过对相关请求进行分组来减少网络流量。

未记录批次的语法与已记录批次的语法类似，但增加了`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>

**记录**的批处理将多个写入操作合并为一个原子操作。运行已记录的批处理时：
+ 所有行动要么一起成功，要么一起失败。
+ 该操作是同步的，并且是等性的。
+ 您可以写入多个 Amazon Keyspaces 表，前提是它们位于同一个 AWS 账户中，并且。 AWS 区域

记录的批次的延迟可能稍高一些。对于高吞吐量的应用程序，可以考虑使用未记录的批处理。

在 Amazon Keyspaces 中使用已记录的批次不会产生额外费用。您只需为作为批处理操作一部分的写入操作付费。Amazon Keyspaces 对批处理中的每一行执行两次基础写入：一次用于为批处理准备该行，另一次用于提交批处理。在为使用已记录批处理的表规划容量时，请记住，批次中的每行需要的容量是标准写入操作的两倍。例如，如果您的应用程序每秒运行一个包含三行 1KB 的记录批次，则需要预置六个写入容量单位 (WCUs)，而 WCUs对于单个写入或未记录的批次，则只需要配置三个写入容量单位。

有关定价的信息，请参阅 [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` 运算符
+ `LIKE` 运算符
+ `BETWEEN` 运算符

在记录的批处理中不支持：  
+ 影响同一行的多条语句
+ 反击行动
+ 范围删除

### 记录的批处理语句的失败条件
<a name="batchStatement-failures"></a>

在以下任何一种情况下，记录的批处理操作都可能失败：
+ 条件表达式（如`IF NOT EXISTS`或`IF`）的计算结果为 false。
+ 一个或多个操作包含无效的参数。
+ 该请求与在同一行上运行的另一个批处理操作发生冲突。
+ 该表缺少足够的预置容量。
+ 一行超过了最大大小限制。
+ 输入数据格式无效。

### Batch 语句和多区域复制
<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 指标外，您还可以使用 AWS CloudTrail 记录所有 Amazon Keyspaces API 操作。批次中的每个 API 操作都已登录， CloudTrail 因此可以更轻松地跟踪和审计 Amazon Keyspaces 表中的批量操作。

### Batch 操作示例
<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;
```