web-dev-qa-db-fra.com

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

Une opération de requête telle que spécifiée dans la documentation DynamoDb:

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

et l'opération de numérisation:

Une opération d'analyse analyse toute la table. Vous pouvez spécifier des filtres à appliquer aux résultats pour affiner les valeurs renvoyées après l'analyse complète.

Ce qui est le mieux basé sur les considérations de performance et de coût.

45
samson

Vous rencontrez la clé de partition de table dynamodb/la clé primaire en tant que customer_country. Si vous utilisez la requête, customer_country est le champ obligatoire pour effectuer une opération de requête. Tous les filtres ne peuvent être faits que des éléments appartenant à customer_country.

Si vous effectuez une analyse de table, le filtre sera appliqué à toutes les clés de partition/clés primaires. Tout d'abord, il récupère toutes les données et applique le filtre après l'extraction de la table.

par exemple:

ici customer_country est le clé de partition/clé primaire et id est le sort_key

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

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, cela ne s'applique que sur customer_country valeur. La valeur ne doit être qu'opérateur égal (=).

  • Ainsi, seuls les éléments égaux à cette clé de partition/valeur de clé primaire sont récupérés.

  • Si vous effectuez une opération d'analyse, il extrait tous les éléments de cette table et filtre les données une fois qu'elles ont été traitées.

Remarque: N'effectuez pas d'analyse car votre RCU dépasse.

30
OK200

Lors de la création d'une table Dynamodb, sélectionnez Clés principales et Index secondaires locaux (LSI) afin qu'une opération de requête retourne les éléments souhaités.

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

Les opérations d'analyse 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 que vous demandez.

Exemple:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

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

  1. Un CustomerId avec un filtre conditionnel sur AccountType

Une opération de numérisation doit être utilisée pour renvoyer:

  1. Tous les clients avec un type de compte 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 LastPurchase, c'est-à-dire tous les clients ayant effectué un achat le mois dernier

Pour éviter les opérations de numérisation sur les opérations fréquemment utilisées créant un index secondaire local (LSI) ou un index secondaire global (GSI).

Exemple:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase

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

  1. Un CustomerId avec un filtre conditionnel sur AccountType
  2. [GSI] Filtre conditionnel sur CustomerIds pour un type de compte spécifique
  3. [LSI] Un CustomerId avec un filtre conditionnel sur LastPurchase
27
Kinman

En termes de performances, je pense que c'est une bonne pratique de concevoir votre table pour que les applications utilisent Query au lieu de Scan. Dans la mesure où une opération d'analyse analyse toujours l'intégralité de la table avant de filtrer les valeurs souhaitées, le traitement des opérations de données telles que la lecture, l'écriture et la suppression prend plus de temps et d'espace. Pour plus d'informations, veuillez vous référer à le document officiel

6
Liutong Chen

Query est beaucoup mieux que Scan - performance sage. scan, comme son nom l'indique, va scanner toute la table. Cependant, vous devez bien connaître la clé de table, la clé de tri, les index et les index de tri associés, afin de savoir que vous pouvez utiliser la requête. si vous filtrez votre requête en utilisant:

  • clé
  • type de clé
  • indice
  • index et il est lié clé de tri

utilisez Query! sinon utilisez scan qui est plus flexible sur les colonnes que vous pouvez filtrer.

vous ne pouvez PAS interroger 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 normaux (pas clé, index ou tri)
  • index et tri mélangés (index1 avec sorte d'index2) \
  • ...

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

3
Open Voip

Son semblable à celui de la base de données relationnelle.

Obtenez query vous utilisez une clé primaire dans where condition, la complexité de calcul est log(n), car la structure de clé la plus grande partie est un arbre binaire.

alors que scan requête vous devez analyser toute la table puis appliquer un filtre sur chaque row pour trouver le bon résultat. La performance est O(n). C'est beaucoup plus lent si votre table est grande.

En bref, essayez d'utiliser get si vous connaissez la clé primaire. seulement scan pour le pire des cas.

Pensez également à l'index secondaire global pour prendre en charge un type différent de requêtes sur différentes clés pour atteindre un objectif de performance.

0
Joey Trang