本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon Keyspaces 中使用批次陳述式
您可以將多個 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)。
未記錄的批次
使用未記錄的批次時,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;
已記錄的批次
記錄的批次會將多個寫入動作合併為單一原子操作。當您執行記錄的批次時:
-
所有動作會一起成功或一起失敗。
-
操作是同步且等冪的。
-
您可以寫入多個 Amazon Keyspaces 資料表,只要它們位於相同的 AWS 帳戶和 AWS 區域。
記錄的批次可能會有稍微較高的延遲。對於高輸送量應用程式,請考慮使用未記錄的批次。
在 Amazon Keyspaces 中使用記錄的批次無需額外費用。您只需為屬於批次操作的寫入付費。Amazon Keyspaces 會執行批次中每一列的兩個基礎寫入:一個用於準備批次的資料列,另一個用於遞交批次。為使用記錄批次的資料表規劃容量時,請記住,批次中的每一列都需要標準寫入操作的兩倍容量。例如,如果您的應用程式每秒執行一個記錄批次,其中包含三個 1KB 資料列,則需要佈建六個寫入容量單位 (WCUs),而個別寫入或未記錄批次只需要三個 WCUs。
如需定價的相關資訊,請參閱 Amazon Keyspaces (適用於 Apache Cassandra) 定價
批次操作的最佳實務
使用 Amazon Keyspaces 批次操作時,請考慮下列建議實務。
-
啟用自動擴展,以確保您有足夠的輸送量容量讓資料表處理批次操作,以及記錄批次的額外輸送量需求。
-
當操作可以獨立執行時,請使用個別操作或未記錄的批次,而不會影響應用程式的正確性。
-
設計您的應用程式,將相同資料列的並行更新降至最低,因為同時批次操作可能會衝突和失敗。
-
對於沒有原子需求的高輸送量大量資料擷取,請使用個別寫入操作或未記錄的批次。
一致性和並行
Amazon Keyspaces 會針對記錄的批次強制執行下列一致性和並行規則:
-
所有批次操作都使用
LOCAL_QUORUM一致性層級。 -
影響不同資料列的並行批次可以同時執行。
在進行中批次中涉及的資料列上並行
INSERTUPDATE、 或DELETE操作會失敗並產生衝突。
支援的運算子和條件
- 支援的
WHERE子句運算子: -
等式 (=)
- 不支援的運算子:
-
範圍運算子 (>、<、>=、<=)
IN運算子LIKE運算子BETWEEN運算子
- 記錄的批次中不支援:
-
影響相同資料列的多個陳述式
計數器操作
範圍刪除
已記錄批次陳述式的失敗條件
在下列任何情況下,記錄的批次操作可能會失敗:
-
條件表達式 (例如
IF NOT EXISTS或IF) 會評估為 false。 -
一或多個操作包含無效的參數。
-
請求與在相同資料列上執行的另一個批次操作衝突。
-
資料表缺少足夠的佈建容量。
-
資料列超過大小上限。
-
輸入資料格式無效。
批次陳述式和多區域複寫
在多區域部署中:
-
來源區域操作是同步和原子的。
-
目的地區域操作是非同步的。
-
所有批次操作都保證可複寫,但可能無法在應用程式期間維持隔離。
監控批次操作
您可以使用 Amazon CloudWatch 指標來監控批次操作,以追蹤效能、錯誤和用量模式。Amazon Keyspaces 提供下列 CloudWatch 指標,用於監控每個資料表的批次操作:
SuccessfulRequestCount– 追蹤成功的批次操作。Latency– 測量批次操作效能。ConsumedWriteCapacityUnits– 監控批次操作的容量耗用。
如需詳細資訊,請參閱Amazon Keyspaces 指標。
除了 CloudWatch 指標之外,您還可以使用 AWS CloudTrail 記錄所有 Amazon Keyspaces API 動作。批次中的每個 API 動作都會記錄在 CloudTrail 中,讓您更輕鬆地追蹤和稽核 Amazon Keyspaces 資料表中的批次操作。
批次操作範例
以下是基本記錄批次陳述式的範例。
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;