Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

項目サイズおよびキャパシティーユニットの消費

テーブルの読み込みおよび書き込みキャパシティーを選択する前に、データとアプリケーションによるデータへのアクセス方法を最初に理解する必要があります。これらの入力は、テーブルの全体的なストレージやスループットのニーズ、さらにアプリケーションに必要なスループットキャパシティーを判断します。DynamoDB テーブルはプライマリキーを除いてスキーマレスであるため、テーブルの項目の属性、サイズ、データ型はすべて異なる場合があります。

項目の合計サイズは、属性名と属性値の長さの合計です。次のガイドラインを使用して属性サイズを予測することができます。

  • 文字列は、UTF-8 バイナリエンコードの Unicode です。文字列のサイズは、(属性名の長さ) + (UTF-8 でエンコードされたバイト数) です。

  • 数値は、有効桁数が最大 38 の可変長です。先頭と末尾の 0 は切り捨てられます。数値のおおよそのサイズは、(属性名の長さ) + (有効桁数 2 あたり 1 バイト) + (1 バイト) です。

  • バイナリ値を DynamoDB に送信するには base64 形式でエンコードする必要がありますが、サイズの計算には値の実際のバイト長が使用されます。バイナリ属性のサイズは、(属性名の長さ) + (raw バイト数) です。

  • null 属性または Boolean 属性のサイズは、(属性名の長さ) + (1 バイト) です。

  • リスト型またはマップ型の属性は、その内容にかかわらず、余分な 3 バイトが必要です。リストまたはマップのサイズは、(属性名の長さ) + (入れ子要素のサイズの合計) + (3 バイト) です。空のリストまたはマップのサイズは、(属性名の長さ) + (3 バイト) です。

注記

属性名は長いものよりも短いものにすることをお勧めします。これにより、キャパシティーユニットの消費を最適化し、データに必要なストレージ量を削減するのに役立ちます。

読み込みでのキャパシティーユニットの消費

DynamoDB 読み込みオペレーションが読み込みキャパシティーユニットを消費する仕組みについて次に説明します。

  • GetItem — テーブルから単一の項目を読み取ります。GetItem が消費するキャパシティーユニットの数を決定するには、項目のサイズを次の 4 KB 境界まで切り上げます。強力な整合性のある読み込みを指定した場合は、これが必要なキャパシティーユニットの数になります。結果的に整合性のある読み込み(デフォルト)の場合、この数を 2 で割ります。

    たとえば、3.5 KB の項目を読み取ると、DynamoDB は項目サイズを 4 KB まで切り上げます。10 KB の項目を読み取ると、DynamoDB は項目サイズを 12 KB まで切り上げます。

  • BatchGetItem — 1 つ以上のテーブルから最大 100 個の項目を読み取ります。DynamoDB はバッチの各項目を個別の GetItem リクエストとして処理するため、DynamoDB は各項目のサイズを次の 4 KB 境界にまず切り上げてから、合計サイズを計算します。この結果は、すべての項目の合計サイズと必ずしも同じではありません。たとえば、BatchGetItem が 1.5 KB の項目と 6.5 KB の項目を読み込むと、DynamoDB は、サイズを 8 KB (1.5 KB + 6.5 KB) ではなく、12 KB (4 KB + 8 KB) と算出します。

  • Query — 同じパーティションキー値を持つ複数の項目を読み取ります。返されるすべての項目は単一の読み込みオペレーションとして扱われ、DynamoDB はすべての項目の合計サイズを計算し、次の 4 KB 境界に切り上げます。たとえば、クエリの結果、合計サイズが 40.8 KB になる 10 項目が返されるとします。DynamoDB はオペレーションの項目サイズを 44 KB まで切り上げます。クエリの結果、64 バイトの項目が 1,500 項目返されると、累積サイズは 96 KB になります。

  • Scan — テーブルのすべての項目を読み取ります。DynamoDB は、スキャンにより返される項目のサイズではなく、評価される項目のサイズを考慮します。

存在しない項目に対して読み込みオペレーションを実行しても、DynamoDB ではやはりプロビジョンド読み込みスループットが消費されます。強力な整合性のある読み込みオペレーションでは、1 つの読み込みキャパシティーユニットが消費されますが、結果整合性のある読み込みオペレーションでは、半分の読み込みキャパシティーユニットが消費されます。

項目を返すオペレーションの場合、取り出す属性の一部をリクエストできます。ただし、項目サイズの計算には影響を及ぼしません。また、QueryScan は、属性値の代わりに項目数を返します。項目数の取得には、同じ量の読み込みキャパシティーユニットが使用され、その結果は同じ項目サイズの計算の影響を受けます。これは、DynamoDB では、項目数を増加させるために各項目を読み込む必要があるためです。

読み取りオペレーションと読み取り整合性

前出の計算によって、強い整合性のある読み込みリクエストが仮定されます。結果整合性のある読み込みリクエストでは、このオペレーションによってキャパシティーユニットの半分のみが消費されます。結果整合性のある読み込みでは、合計項目サイズが 80 KB の場合、オペレーションによって 10 キャパシティーユニットのみが消費されます。

書き込みでのキャパシティーユニットの消費

DynamoDB 書き込みオペレーションが書き込みキャパシティーユニットを消費する仕組みについて次に説明します。

  • PutItem — テーブルに単一の項目を書き込みます。同じプライマリキーを持つ項目がテーブル内に存在する場合、このオペレーションによって項目が置き換えられます。プロビジョニングされたスループットの消費量を算出する場合、重要な項目サイズは 2 つのうち大きい方となります。

  • UpdateItem — テーブル内の単一の項目を変更します。DynamoDB は更新の前後で実際の項目のサイズを考慮します。プロビジョニングされたスループットの消費は、これらの項目サイズの大きい方を反映しています。項目の属性の一部だけを更新した場合でも、UpdateItem は、プロビジョニングされたスループットの総量 ("前" の項目サイズと "後" の項目サイズで、より大きい方) を消費します。

  • DeleteItem — テーブルから単一の項目を削除します。プロビジョニングされたスループットの消費量は、削除された項目のサイズに基づいています。

  • BatchWriteItem — 1 つ以上のテーブルから最大 25 個の項目を書き込みます。DynamoDB はバッチの各項目を個別の PutItem または DeleteItem リクエスト (更新はサポートされない) として処理するため、DynamoDB は各項目のサイズを次の 1 KB 境界にまず切り上げてから、合計サイズを計算します。この結果は、すべての項目の合計サイズと必ずしも同じではありません。たとえば、BatchWriteItem が 500 バイトと 3.5 KB の項目を書き込んだ場合、DynamoDB はサイズを、4 KB (500 bytes + 3.5 KB) ではなく、5 KB (1 KB + 4 KB) と計算します。

PutItemUpdateItem、および DeleteItem の各オペレーションでは、DynamoDB は項目のサイズを次の 1 KB に切り上げます。たとえば、1.6 KB の項目を入力または削除すると、DynamoDB は項目サイズを 2 KB まで切り上げます。

PutItemUpdateItemDeleteItem では、条件付き書き込みを行えます。ここでは、条件が true と評価される式を指定して、オペレーションが正常に実行されるようにします。式が false と評価された場合でも、DynamoDB はテーブルの書き込みキャパシティーユニットを消費します。

  • 既存の項目の場合、消費される書き込みキャパシティーユニットの数は、新しい項目のサイズによって異なります。(たとえば、1 KB の項目の条件付き書き込みが失敗すると、1 つの書き込みキャパシティーユニットが消費されます。新しい項目のサイズがその倍である場合、条件付き書き込みが失敗すると、2 つの書き込みキャパシティーユニットが消費されます)

  • 新しい項目の場合、DynamoDB は 1 つの書き込みキャパシティーユニットを消費します。