web-dev-qa-db-fra.com

Quelle est la différence entre BatchGetItem et Query dans DynamoDB?

J'ai parcouru les documents AWS DynamoDB et, pour la vie de moi, je ne peux pas comprendre quelle est la principale différence entre batchGetItem () et Query (). Les deux récupèrent des éléments en fonction des clés primaires des tables et des index. La seule différence réside dans la taille des éléments récupérés, mais cela ne semble pas être une différence révolutionnaire. Les deux prennent également en charge les mises à jour conditionnelles.

Dans quels cas dois-je utiliser batchGetItem sur Query et vice-versa?

32
suv

En bref: BatchGetItem fonctionne sur les tables et utilise la clé de hachage pour identifier les éléments que vous souhaitez récupérer. Vous pouvez obtenir jusqu'à 16 Mo ou 100 éléments dans une réponse

La requête fonctionne sur les tables, les index secondaires locaux et les index secondaires globaux. Vous pouvez obtenir au plus 1 Mo de données dans une réponse. La plus grande différence est que les expressions de filtre prennent en charge les requêtes, ce qui signifie que vous pouvez demander des données et DDB les filtrera côté serveur pour vous.

Vous pouvez probablement obtenir la même chose si vous souhaitez utiliser l'un de ces éléments si vous le souhaitez, mais la règle de base est que vous effectuez un BatchGet lorsque vous avez besoin de vider des données en masse à partir de DDB et que vous vous demandez quand vous devez affiner ce que vous voulez récupérer (et vous voulez que la dynamo fasse le gros du travail en filtrant les données pour vous).

17
Mircea

Selon la documentation officielle: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#CapacityUnitCalculations

Pour BatchGetItem, chaque élément du lot est lu séparément, donc DynamoDB arrondit d'abord la taille de chaque élément aux 4 Ko suivants, puis calcule la taille totale. Le résultat n'est pas nécessairement le même que la taille totale de tous les articles. Par exemple, si BatchGetItem lit un élément de 1,5 Ko et un élément de 6,5 Ko, DynamoDB calculera la taille comme 12 Ko (4 Ko + 8 Ko), et non 8 Ko (1,5 Ko + 6,5 Ko).

Pour Query, tous les éléments retournés sont traités comme une seule opération de lecture. Par conséquent, DynamoDB calcule la taille totale de tous les éléments, puis arrondit à la limite de 4 Ko suivante. Par exemple, supposons que votre requête renvoie 10 éléments dont la taille combinée est de 40,8 Ko. DynamoDB arrondit la taille de l'élément pour l'opération à 44 Ko. Si une requête renvoie 1 500 éléments de 64 octets chacun, la taille cumulée est de 96 Ko.

Par conséquent, vous ne devez utiliser BatchGetItem que si vos éléments sont tous relativement gros (de sorte que l'arrondi de 4 Ko a peu d'impact) et que vous devez récupérer> 1 Mo en un seul appel.

Dans toute autre situation, utilisez Query, sinon vous finirez par être facturé beaucoup plus pour rien;)

30
stephane

Il y a une distinction importante qui manque dans les autres réponses:

  • La requête nécessite une clé partition
  • BatchGetItems nécessite une clé primaire

La requête n'est utile que si les éléments que vous souhaitez obtenir arrivent à partager une clé de partition (hachage), et vous devez fournir cette valeur. De plus, vous devez fournir la valeur exacte; vous ne pouvez pas faire de correspondance partielle avec la clé de partition. À partir de là, vous pouvez spécifier une valeur supplémentaire (et potentiellement partielle/conditionnelle) pour la clé de tri afin de réduire la quantité de données lues et de réduire davantage la sortie avec une FilterExpression. C'est génial, mais il a la grande limitation que vous ne pouvez pas obtenir des données qui vivent en dehors d'une seule partition.

BatchGetItems est le revers de la médaille. Vous pouvez obtenir des données sur de nombreuses partitions (et même sur plusieurs tables), mais vous devez connaître complet et la clé primaire exacte: c'est-à-dire à la fois la clé de partition (hachage) et tout type (plage). C'est littéralement comme appeler plusieurs fois GetItem en une seule opération. Vous n'avez pas les options de recherche partielle et de filtrage de Query, mais vous n'êtes pas non plus limité à une seule partition.

1
Craig Walker