114 votes

Quelle est la différence entre scan et query dans DynamoDB? Quand utiliser scan / query?

Une opération de requête comme spécifiée dans la documentation de DynamoDB :

Une opération de requête recherche uniquement des valeurs d'attributs de clé primaire et prend en charge un sous-ensemble d'opérateurs de comparaison sur les valeurs d'attributs de clé pour affiner le processus de recherche.

et l'opération de balayage :

Une opération de balayage parcourt l'ensemble de la table. Vous pouvez spécifier des filtres à appliquer aux résultats pour affiner les valeurs renvoyées, après le balayage complet.

Laquelle est la meilleure en termes de performances et de coûts ?

78voto

Kinman Points 442

Lors de la création d'une table DynamoDB, sélectionnez des clés primaires et des index secondaires locaux (ISL) de sorte qu'une opération de requête renvoie les éléments souhaités.

Les opérations de requête ne prennent en charge qu'une évaluation de l'opérateur d'égalité de la clé primaire, mais conditionnelle (=, <, <=, >, >=, Between, Begin) sur la clé de tri.

Les opérations de balayage sont généralement plus lentes et plus coûteuses car l'opération doit parcourir chaque élément de votre table pour obtenir les éléments demandés.

Exemple:

Tableau: IDClient, TypeCompte, Pays, DernierAchat

Clé primaire: IDClient + TypeCompte

Dans cet exemple, vous pouvez utiliser une opération de requête pour obtenir:

  1. Un IDClient avec un filtre conditionnel sur le TypeCompte

Une opération de balayage devrait être utilisée pour renvoyer:

  1. Tous les clients avec un TypeCompte spécifique
  2. Éléments basés sur des filtres conditionnels par pays, c'est-à-dire tous les clients des États-Unis
  3. Éléments basés sur des filtres conditionnels par DernierAchat, c'est-à-dire tous les clients ayant fait un achat le mois dernier

Pour éviter les opérations de balayage sur les opérations fréquemment utilisées, créez un index secondaire local (ISL) ou un index secondaire global (ISG).

Exemple:

Tableau: IDClient, TypeCompte, Pays, DernierAchat

Clé primaire: IDClient + TypeCompte
ISG: TypeCompte + IDClient
ISL: IDClient + DernierAchat

Dans cet exemple, une opération de requête peut vous permettre d'obtenir:

  1. Un IDClient avec un filtre conditionnel sur le TypeCompte
  2. [ISG] Un filtre conditionnel sur les IDClient pour un TypeCompte spécifique
  3. [ISL] Un IDClient avec un filtre conditionnel sur le DernierAchat

1 votes

Si clé primaire: CustomerId + AccountType (Je comprends que CustomerID est la clé de partition et AccountType est la clé de tri), je pense que vous pouvez seulement exécuter une opération de requête par CustomerID ou par CustomerID + AccountType. Si vous recherchez uniquement par AccountType, cela nécessiterait une analyse.

1 votes

Merci @Adil. Tu as raison, j'ai modifié ma réponse pour refléter cela.

40voto

OK200 Points 398

Vous avez la clé de partition/clé principale de la table dynamodb comme customer_country. Si vous utilisez une requête, customer_country est le champ obligatoire pour effectuer l'opération de requête. Tous les filtres ne peuvent être appliqués qu'aux éléments appartenant à customer_country.

Si vous effectuez un scan de la table, le filtre sera effectué sur toutes les clés de partition/clés principales. Tout d'abord, toutes les données sont récupérées et le filtre est appliqué après les avoir récupérées de la table.

par exemple:

ici, customer_country est la clé de partition/clé principale et id est la clé de tri

-----------------------------------

customer_country | name   | id

-----------------------------------
VV               | Tom    | 1

VV               | Jack   | 2

VV               | Mary   | 4

BB               | Nancy  | 5

BB               | Lom    | 6

BB               | XX     | 7

CC               | YY     | 8

CC               | ZZ     | 9

------------------------------------
  • Si vous effectuez une opération de requête, elle s'applique uniquement à la valeur de customer_country. La valeur doit être seulement l'opérateur égal (=).

  • Donc seuls les éléments égaux à cette valeur de clé de partition/clé principale sont récupérés.

  • Si vous effectuez une opération de scan, cela récupère tous les éléments dans cette table et filtre les données après les avoir récupérées.

Note: Ne pas effectuer d'opération de scan car cela dépasse votre RCU.

0 votes

Pouvez-vous indiquer la source de votre réponse ?

2 votes

0 votes

Au-dessus de customer_country est la clé de partition/clé primaire est en soi une déclaration incorrecte. Je ne pense pas que ce soit la clé primaire après avoir vu les valeurs en double dans la colonne - customer_country.

15voto

Joey Points 213

C'est similaire à la base de données relationnelle.

Lorsque vous utilisez une clé primaire dans la condition where de votre query, la complexité de calcul est log(n) car la plupart des structures de clés sont des arbres binaires.

En revanche, pour une scan query, vous devez parcourir l'ensemble de la table, puis appliquer un filtre à chaque row individuelle pour trouver le bon résultat. Les performances sont de l'ordre de O(n). C'est beaucoup plus lent si votre table est grande.

En résumé, utilisez query si vous connaissez la clé primaire. Utilisez scan uniquement en cas de nécessité absolue.

De plus, envisagez l'utilisation d'un index secondaire global pour prendre en charge différents types de requêtes sur différentes clés et ainsi atteindre vos objectifs de performance.

12voto

Liutong Chen Points 486

En termes de performance, je pense qu'il est bon de concevoir votre table pour les applications utilisant Query au lieu de Scan. Parce qu'une opération de scan parcourt toujours l'ensemble de la table avant de filtrer les valeurs désirées, ce qui signifie qu'elle prend plus de temps et d'espace pour traiter les opérations de données telles que la lecture, l'écriture et la suppression. Pour plus d'informations, veuillez consulter le document officiel

10voto

Open Voip Points 133

La requête est bien meilleure que le Scan - en termes de performance. Le scan, comme son nom l'indique, va balayer l'ensemble de la table. Mais vous devez bien connaître la clé de la table, la clé de tri, les index et les index de tri associés pour savoir si vous pouvez utiliser la requête. si vous filtrez votre requête en utilisant :

  • la clé
  • la clé et la clé de tri
  • l'index
  • l'index et sa clé de tri associée

utilisez la requête! Sinon, utilisez le scan qui est plus flexible en ce qui concerne les colonnes que vous pouvez filtrer.

vous NE pouvez PAS effectuer de requête si :

  • plus de 2 champs dans le filtre (par exemple, clé, tri et index)
  • clé de tri uniquement (de la clé primaire ou de l'index)
  • champs réguliers (non clé, index ou tri)
  • index et tri mixtes (index1 avec tri de l'index2)\
  • ...

une bonne explication : https://medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X