web-dev-qa-db-ja.com

DynamoDBのBatchGetItemとQueryの違いは何ですか?

私はAWS DynamoDBのドキュメントを調べてきましたが、私の人生では、batchGetItem()とQuery()の主要な違いを理解することはできません。どちらも、テーブルとインデックスから主キーに基づいてアイテムを取得します。唯一の違いは、取得されるアイテムのサイズにありますが、これは画期的な違いのようには見えません。どちらも条件付き更新をサポートしています。

どのような場合にQueryではなくbatchGetItemを使用する必要がありますか?

32
suv

簡単に言うと、BatchGetItemはテーブルで機能し、ハッシュキーを使用して取得するアイテムを識別します。応答で最大16MBまたは100個のアイテムを取得できます

クエリは、テーブル、ローカルセカンダリインデックス、グローバルセカンダリインデックスで機能します。応答で最大1MBのデータを取得できます。最大の違いは、クエリがフィルター式をサポートしていることです。つまり、データを要求でき、DDBはサーバー側でそれをフィルターします。

本当にしたいのであれば、これらのいずれかを使用したい場合はおそらく同じことを達成できますが、大まかなルールは、DDBからのものを一括ダンプする必要があるときにBatchGetを実行し、何を絞り込む必要があるときにクエリを実行することです取得したい(そして、ダイナモにデータをフィルタリングするための重いリフティングを実行させたい)。

17
Mircea

公式ドキュメントに従って: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#CapacityUnitCalculations

BatchGetItemの場合、バッチ内の各アイテムは個別に読み取られるため、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)として計算します。

クエリの場合、返されるすべてのアイテムは単一の読み取り操作として扱われます。その結果、DynamoDBはすべてのアイテムの合計サイズを計算し、次の4 KB境界に切り上げます。たとえば、クエリが合計サイズが40.8 KBの10個のアイテムを返すとします。 DynamoDBは、操作のアイテムサイズを44 KBに丸めます。クエリがそれぞれ64バイトの1500個のアイテムを返す場合、累積サイズは96 KBです。

したがって、BatchGetItemは、アイテムがすべて比較的大きい場合にのみ使用する必要があり(したがって、4KBの切り上げによる影響はほとんどありません)、1回の呼び出しで> 1MBを取得する必要があります。

それ以外の場合は、Queryを使用します。そうしないと、無料ではるかに多く請求されることになります;)

30
stephane

他の回答とは異なる重要な区別があります。

  • クエリにはpartitionキーが必要です
  • BatchGetItemsにはprimaryキーが必要です

クエリは、取得するアイテムがパーティション(ハッシュ)キーを共有する場合にのみ有用であり、この値を指定する必要があります。さらに、exact値を指定する必要があります。パーティションキーに対して部分一致を行うことはできません。そこから、ソートキーに追加の(および潜在的に部分的/条件付きの)値を指定して、読み取られるデータの量を減らし、FilterExpressionで出力をさらに減らすことができます。これはすばらしいことですが、単一のパーティション外にあるデータを取得できないという大きな制限があります。

BatchGetItemsはこの裏返しです。多くのパーティション(および複数のテーブル)でデータを取得できますが、fullおよび正確な主キーを知っている必要があります:つまり、パーティション(ハッシュ)キーおよび任意のソート(範囲)。文字通り、GetItemを1回の操作で複数回呼び出すようなものです。クエリの部分検索とフィルタリングのオプションはありませんが、単一のパーティションに制限されていません。

1
Craig Walker