DynamoDB - Analyse

Les opérations d'analyse lisent tous les éléments de table ou les index secondaires. Sa fonction par défaut entraîne le renvoi de tous les attributs de données de tous les éléments d'un index ou d'une table. Employer leProjectionExpression paramètre dans les attributs de filtrage.

Chaque analyse renvoie un jeu de résultats, même si aucune correspondance n'est trouvée, ce qui donne un jeu vide. Les analyses ne récupèrent pas plus de 1 Mo, avec la possibilité de filtrer les données.

Note - Les paramètres et le filtrage des scans s'appliquent également aux requêtes.

Types d'opérations de scan

Filtering- Les opérations d'analyse offrent un filtrage fin à travers des expressions de filtre, qui modifient les données après des analyses ou des requêtes; avant de renvoyer les résultats. Les expressions utilisent des opérateurs de comparaison. Leur syntaxe ressemble aux expressions de condition à l'exception des attributs clés, que les expressions de filtre ne permettent pas. Vous ne pouvez pas utiliser de partition ou de clé de tri dans une expression de filtre.

Note - La limite de 1 Mo s'applique avant toute application de filtrage.

Throughput Specifications- Les analyses consomment du débit, cependant, la consommation se concentre sur la taille de l'élément plutôt que sur les données renvoyées. La consommation reste la même que vous demandiez tous les attributs ou seulement quelques-uns, et l'utilisation ou non d'une expression de filtre n'a pas non plus d'impact sur la consommation.

Pagination- DynamoDB pagine les résultats provoquant la division des résultats en pages spécifiques. La limite de 1 Mo s'applique aux résultats renvoyés, et lorsque vous la dépassez, une autre analyse devient nécessaire pour collecter le reste des données. leLastEvaluatedKeyvalue vous permet d'effectuer cette analyse ultérieure. Appliquez simplement la valeur auExclusiveStartkey. Quand leLastEvaluatedKeyvalue devient nulle, l'opération a terminé toutes les pages de données. Cependant, une valeur non nulle ne signifie pas automatiquement qu'il reste plus de données. Seule une valeur nulle indique l'état.

The Limit Parameter- Le paramètre limit gère la taille du résultat. DynamoDB l'utilise pour établir le nombre d'éléments à traiter avant de renvoyer des données et ne fonctionne pas en dehors de la portée. Si vous définissez une valeur de x, DynamoDB renvoie les x premiers éléments correspondants.

La valeur LastEvaluatedKey s'applique également en cas de paramètres de limite donnant des résultats partiels. Utilisez-le pour effectuer des analyses.

Result Count - Les réponses aux requêtes et aux analyses incluent également des informations relatives à ScannedCountet Count, qui quantifie les articles numérisés / interrogés et quantifie les articles retournés. Si vous ne filtrez pas, leurs valeurs sont identiques. Lorsque vous dépassez 1 Mo, les décomptes ne représentent que la partie traitée.

Consistency- Les résultats des requêtes et des analyses sont finalement des lectures cohérentes, cependant, vous pouvez également définir des lectures fortement cohérentes. Utilisez leConsistentRead paramètre pour modifier ce paramètre.

Note - Des paramètres de lecture cohérents ont un impact sur la consommation en utilisant le double des unités de capacité lorsqu'ils sont définis sur fortement cohérent.

Performance- Les requêtes offrent de meilleures performances que les analyses en raison des analyses explorant la table complète ou l'index secondaire, ce qui entraîne une réponse lente et une consommation de débit élevée. Les analyses fonctionnent mieux pour les petites tables et les recherches avec moins de filtres, cependant, vous pouvez concevoir des analyses allégées en obéissant à quelques bonnes pratiques, comme éviter une activité de lecture soudaine et accélérée et exploiter des analyses parallèles.

Une requête trouve une certaine plage de clés satisfaisant une condition donnée, les performances étant dictées par la quantité de données qu'elle récupère plutôt que par le volume de clés. Les paramètres de l'opération et le nombre de correspondances ont un impact spécifique sur les performances.

Balayage parallèle

Les opérations de numérisation exécutent le traitement de manière séquentielle par défaut. Ensuite, ils renvoient les données par portions de 1 Mo, ce qui invite l'application à récupérer la portion suivante. Cela entraîne de longues analyses pour les grandes tables et index.

Cette caractéristique signifie également que les analyses peuvent ne pas toujours exploiter pleinement le débit disponible. DynamoDB distribue les données de table sur plusieurs partitions; et le débit d'analyse reste limité à une seule partition en raison de son fonctionnement sur une seule partition.

Une solution à ce problème vient de la division logique des tables ou des index en segments. Puis les «travailleurs» analysent en parallèle (simultanément) les segments. Il utilise les paramètres de Segment etTotalSegments pour spécifier les segments analysés par certains travailleurs et spécifier la quantité totale de segments traités.

Numéro de travailleur

Vous devez tester les valeurs de travail (paramètre de segment) pour obtenir les meilleures performances d'application.

Note- Les analyses parallèles avec de grands ensembles de travailleurs ont un impact sur le débit en consommant éventuellement tout le débit. Gérez ce problème avec le paramètre Limit, que vous pouvez utiliser pour empêcher un seul worker de consommer tout le débit.

Voici un exemple d'analyse approfondie.

Note- Le programme suivant peut supposer une source de données précédemment créée. Avant d'essayer de l'exécuter, acquérez les bibliothèques de prise en charge et créez les sources de données nécessaires (tables avec les caractéristiques requises ou autres sources référencées).

Cet exemple utilise également Eclipse IDE, un fichier d'informations d'identification AWS et AWS Toolkit dans un projet Eclipse AWS Java.

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.ScanOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;

public class ScanOpSample {  
   static DynamoDB dynamoDB = new DynamoDB(
      new AmazonDynamoDBClient(new ProfileCredentialsProvider())); 
   static String tableName = "ProductList";  
   
   public static void main(String[] args) throws Exception { 
      findProductsUnderOneHun();                       //finds products under 100 dollars
   }  
   private static void findProductsUnderOneHun() { 
      Table table = dynamoDB.getTable(tableName);
      Map<String, Object> expressionAttributeValues = new HashMap<String, Object>(); 
      expressionAttributeValues.put(":pr", 100); 
         
      ItemCollection<ScanOutcome> items = table.scan ( 
         "Price < :pr",                                  //FilterExpression 
         "ID, Nomenclature, ProductCategory, Price",     //ProjectionExpression 
         null,                                           //No ExpressionAttributeNames  
         expressionAttributeValues);
         
      System.out.println("Scanned " + tableName + " to find items under $100."); 
      Iterator<Item> iterator = items.iterator(); 
         
      while (iterator.hasNext()) { 
         System.out.println(iterator.next().toJSONPretty()); 
      }     
   } 
}