

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

# DynamoDB 讀取和寫入
<a name="ddb-reads-writes"></a>

DynamoDB 讀取和寫入是指從資料表擷取資料 (讀取) 並在資料表中插入、更新或刪除資料 (寫入) 的操作。當您使用 DynamoDB 時，請務必了解讀取和寫入的概念，因為這些概念會直接影響應用程式的效能和成本。

本主題提供有關適用於 DynamoDB 的不同讀取一致性類型的詳細資訊。本主題也說明您可能執行的不同讀取和寫入操作的單位耗用量。

**Topics**
+ [DynamoDB 讀取一致性](HowItWorks.ReadConsistency.md)
+ [DynamoDB 讀取和寫入操作](read-write-operations.md)

# DynamoDB 讀取一致性
<a name="HowItWorks.ReadConsistency"></a>

Amazon DynamoDB 會從資料表、本機次要索引 (LSI)、全域次要索引 (GSI) 和串流讀取資料。如需詳細資訊，請參閱[Amazon DynamoDB 的核心元件](HowItWorks.CoreComponents.md)。資料表和 LSI 都提供兩個讀取一致性選項：*最終一致* (預設) 和*高度一致性*讀取。GSI 和串流的所有讀取都是最終一致讀取。

 當您的應用程式將資料寫入 DynamoDB 資料表並收到 HTTP 200 回應 (OK) 時，代表已成功寫入並會永久保存。DynamoDB 提供*專供讀取*隔離，可確保讀取操作一律傳回某個項目已確認的值。讀取將永遠不會從最終沒有成功的寫入中呈現對項目的視圖。專供讀取隔離不會防止在讀取操作後立即修改項目。

## 最終一致讀取
<a name="HowItWorks.ReadConsistency.Eventual"></a>

最終一致是所有讀取操作的預設讀取一致性模式。當向 DynamoDB 資料表或索引發出最終一致讀取時，回應可能無法反映出最近完成的寫入操作結果。如果您在短時間後重複讀取請求，應該最終會傳回最近的資料作為回應。最終一致讀取支援資料表、本機次要索引和全域次要索引。另外請注意，從 DynamoDB 串流的讀取也是最終一致讀取。

 最終一致讀取的成本是高度一致性讀取的一半。如需詳細資訊，請參閱 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/pricing/) 定價。

## 高度一致性讀取
<a name="HowItWorks.ReadConsistency.Strongly"></a>

讀取操作如 `GetItem`、`Query` 與 `Scan` 提供 `ConsistentRead` 參數。當您將 `ConsistentRead` 設定為是時，DynamoDB 會傳回具有最新資料的回應，以反映所有先前寫入操作均更新成功。高度一致性讀取僅支援資料表和本機次要索引。全域次要索引或 DynamoDB 串流不支援高度一致性讀取。

## 全域資料表讀取一致性
<a name="HowItWorks.ReadConsistency.Global"></a>

DynamoDB 也支援用於多重作用中和多區域複寫的[全域資料表](GlobalTables.md)。全域資料表由不同 AWS 區域中的多個複本資料表組成。對任何複本資料表中任何項目所做的任何變更，都會複寫到相同全域資料表中的所有其他複本，通常一秒內即可完成，並且是最終一致。如需詳細資訊，請參閱[一致性模式](V2globaltables_HowItWorks.md#V2globaltables_HowItWorks.consistency-modes)。

# DynamoDB 讀取和寫入操作
<a name="read-write-operations"></a>

DynamoDB 讀取操作可讓您透過指定分割區索引鍵值，以及選擇性的排序索引鍵值，從資料表擷取一或多個項目。使用 DynamoDB 寫入操作，您可以在資料表中插入、更新或刪除項目。本主題說明這兩個操作的容量單位耗用量。

**Topics**
+ [讀取的容量單位耗用量](#read-operation-consumption)
+ [寫入操作的容量單位耗用量](#write-operation-consumption)

## 讀取的容量單位耗用量
<a name="read-operation-consumption"></a>

DynamoDB 讀取請求可以是高度一致的、最終一致的，也可以是交易式。
+ 一個項目最多 4 KB 的*高度一致性*讀取請求需要一個讀取單位。
+ 一個項目最多 4 KB 的*最終一致*讀取請求需要一半讀取單位。
+ 一個項目最多 4 KB 的*交易*讀取請求需要兩個讀取單位。

若要進一步了解 DynamoDB 讀取一致性模式，請參閱 [DynamoDB 讀取一致性](HowItWorks.ReadConsistency.md)。

讀取的項目大小會向上四捨五入到下一個 4 KB 倍數。例如，讀取 3,500 個位元組的項目，將會使用與讀取 4 KB 項目相同的輸送量。

如果您需要讀取大於 4KB 的項目，DynamoDB 需要額外的讀取請求單位。所需的讀取容量單位總數取決於項目大小，以及您需要最終一致或高度一致性讀取。例如，如果您的項目大小為 8 KB，則需要 2 個讀取單位來維持一個高度一致性讀取。如果您選擇最終一致讀取，則需要 1 個讀取單位，對於交易讀取請求則需要 4 個讀取單位。

以下說明 DynamoDB 讀取操作如何使用讀取單位：
+ [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)：讀取資料表中的單一項目。若要求出 `GetItem` 會使用的讀取單位數目，請取得項目的大小，然後將其向上四捨五入到下一個 4 KB 界限。如果您已指定高度一致性讀取，則這是所需的容量單位數目。如果是最終一致讀取 (預設)，請將此數字除以二。

  例如，如果您讀取的項目大小為 3.5 KB，則 DynamoDB 會將項目大小捨入為 4 KB。如果您讀取 10 KB 項目，則 DynamoDB 會將項目大小捨入為 12 KB。
+ [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html)：從一或多個資料表讀取最多 100 個項目。DynamoDB 會將批次中的每個項目作為個別 `GetItem` 請求處理。因此 DynamoDB 會先將每個項目的大小，向上四捨五入至下一個 1 KB 界限，然後計算總大小。結果不一定與所有項目的總大小相同。例如，如果 `BatchGetItem` 讀取兩個大小為 1.5 KB 和 6.5 KB 的項目，DynamoDB 會將大小計算為 12 KB (4 KB \$1 8 KB)。DynamoDB 不會將大小計算為 8 KB (1.5 KB \$1 6.5 KB)。
+ [Query](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)：讀取具有相同分割區索引鍵值的多個項目。傳回的所有項目都會視為單一讀取操作，而 DynamoDB 會計算所有項目的總大小。DynamoDB 接著會將該大小四捨五入到下一個 4 KB 邊界。例如，假設您的查詢傳回 10 個項目，其合併大小是 40.8 KB。DynamoDB 會將操作的項目大小四捨五入為 44 KB。如果查詢傳回各為 64 位元組的 1500 個項目，則累積大小為 96 KB。
+ [Scan](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)：讀取資料表中的所有項目。DynamoDB 會考量所評估項目的大小，而非掃描所傳回項目的大小。如需 Scan 操作的詳細資訊，請參閱 [掃描 DynamoDB 中的資料表](Scan.md)。

**重要**  
如果您對某個*不存在的項目*執行讀取操作，DynamoDB 仍會耗用讀取輸送量，如上所述。對於 `Query`/`Scan` 操作，即使沒有資料，您仍需根據讀取一致性和搜尋來提供請求的分割區數量支付額外的讀取輸送量費用。

針對傳回項目的任何操作，您可請求要擷取的部分屬性。不過，這樣做不會影響項目大小計算。此外，`Query` 和 `Scan` 也可以傳回項目計數，而非屬性值。取得項目計數會使用相同數量的讀取單位，而且會進行相同的項目大小計算，這是因為 DynamoDB 必須讀取每個項目，才能遞增計數。

## 寫入操作的容量單位耗用量
<a name="write-operation-consumption"></a>

一個寫入單位代表一個大小上限為 1 KB 的項目寫入。如果您需要寫入大於 1 KB 的項目，DynamoDB 需要使用額外的寫入單位。交易寫入請求需要 2 個寫入單位才能執行一個大小上限 1 KB 的項目的寫入。所需的寫入請求單位總數取決於項目大小。例如，如果您的項目大小為 2 KB，您需要 2 個寫入單位來維持一個寫入請求，如果是交易寫入請求，則需要 4 個寫入單位。

寫入的項目大小會向上四捨五入到下一個 1 KB 倍數。例如，寫入 500 個位元組的項目，將會使用與寫入 1 KB 項目相同的輸送量。

以下內容說明 DynamoDB 寫入操作如何使用寫入單位：
+ [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)：將單一項目寫入資料表。如果資料表中已有具有相同主索引鍵的項目，則操作會取代該項目。若要計算佈建輸送量使用，則有關的項目大小是兩者中較大的一個。
+ [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)：修改資料表中的單一項目。DynamoDB 會考量項目在更新前後所顯示的大小。使用的佈建輸送量會反映這些項目大小中較大的一個。即使您只更新一小部分項目的屬性，`UpdateItem` 還是會使用完整數量的佈建輸送量 (「之前」和「之後」項目大小中較大的一個)。
+ [DeleteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html)：從資料表中移除單一項目。佈建輸送量使用是根據所刪除項目的大小。
+ [BatchWriteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html)：最多可將 25 個項目寫入一或多個資料表。DynamoDB 會將批次中的每個項目作為個別 `PutItem` 或 `DeleteItem` 請求處理 (不支援更新)。因此 DynamoDB 會先將每個項目的大小，向上四捨五入至下一個 1 KB 界限，然後計算總大小。結果不一定與所有項目的總大小相同。例如，如果 `BatchWriteItem` 寫入兩個大小為 500 位元組和 3.5 KB 的項目，DynamoDB 會將大小計算為 5 KB (1 KB \$1 4 KB)。DynamoDB 不會將大小計算為 4 KB (500 位元組 \$1 3.5 KB)。

針對 `PutItem`、`UpdateItem` 和 `DeleteItem` 操作，DynamoDB 會將項目大小捨入至下一個 1 KB。例如，如果您放置或刪除 1.6 KB 項目，則 DynamoDB 會將項目向上四捨五入到 2 KB。

`PutItem`、`UpdateItem` 和 `DeleteItem` 允許*條件式寫入*，其中您可以指定必須評估為 true，操作才會繼續的表達式。如果表達式計算結果為 false，則 DynamoDB 仍然會從資料表使用寫入容量單位：使用的寫入容量單位數量取決於項目的大小。此項目可以是資料表中的現有項目，或您嘗試建立或更新的新項目。例如，假設現有項目為 300 KB。您嘗試建立或更新的新項目為 310 KB。新項目使用的寫入容量單位將為 310 KB。