

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 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。
+ 一或多個操作包含無效的參數。
+ 請求與在相同資料列上執行的另一個批次操作衝突。
+ 資料表缺少足夠的佈建容量。
+ 資料列超過大小上限。
+ 輸入資料格式無效。

### 批次陳述式和多區域複寫
<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 資料表中的批次操作。

### 批次操作範例
<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;
```