DynamoDB - Scansione

Le operazioni di scansione leggono tutti gli elementi della tabella o gli indici secondari. La sua funzione predefinita restituisce tutti gli attributi di dati di tutti gli elementi all'interno di un indice o di una tabella. Utilizza ilProjectionExpression parametro negli attributi di filtraggio.

Ogni scansione restituisce un set di risultati, anche se non trova corrispondenze, il che risulta in un set vuoto. Le scansioni recuperano non più di 1 MB, con la possibilità di filtrare i dati.

Note - I parametri e il filtro delle scansioni si applicano anche alle query.

Tipi di operazioni di scansione

Filtering- Le operazioni di scansione offrono un filtraggio preciso attraverso espressioni di filtro, che modificano i dati dopo scansioni o query; prima di restituire i risultati. Le espressioni utilizzano operatori di confronto. La loro sintassi è simile alle espressioni di condizione con l'eccezione degli attributi chiave, che le espressioni di filtro non consentono. Non è possibile utilizzare una partizione o una chiave di ordinamento in un'espressione di filtro.

Note - Il limite di 1 MB si applica prima di qualsiasi applicazione di filtraggio.

Throughput Specifications- Le scansioni consumano il throughput, tuttavia, il consumo si concentra sulla dimensione dell'elemento piuttosto che sui dati restituiti. Il consumo rimane lo stesso sia che si richieda ogni attributo o solo pochi, e l'utilizzo o meno di un'espressione di filtro non influisce sul consumo.

Pagination- DynamoDB impagina i risultati causando la divisione dei risultati in pagine specifiche. Il limite di 1 MB si applica ai risultati restituiti e, quando lo si supera, diventa necessaria un'altra scansione per raccogliere il resto dei dati. IlLastEvaluatedKeyvalore consente di eseguire questa scansione successiva. Basta applicare il valore al fileExclusiveStartkey. Quando ilLastEvaluatedKeyvalore diventa nullo, l'operazione ha completato tutte le pagine di dati. Tuttavia, un valore non nullo non significa automaticamente che rimangono più dati. Solo un valore null indica lo stato.

The Limit Parameter- Il parametro limit gestisce la dimensione del risultato. DynamoDB lo utilizza per stabilire il numero di elementi da elaborare prima di restituire i dati e non funziona al di fuori dell'ambito. Se imposti un valore x, DynamoDB restituisce i primi x elementi corrispondenti.

Il valore LastEvaluatedKey si applica anche nei casi di parametri limite che producono risultati parziali. Usalo per completare le scansioni.

Result Count - Le risposte a domande e scansioni includono anche informazioni relative a ScannedCounte Count, che quantifica gli elementi scansionati / interrogati e quantifica gli elementi restituiti. Se non filtri, i loro valori sono identici. Quando superi 1 MB, i conteggi rappresentano solo la parte elaborata.

Consistency- I risultati delle query ei risultati della scansione sono alla fine letture coerenti, tuttavia, puoi anche impostare letture fortemente coerenti. Utilizzare ilConsistentRead parametro per modificare questa impostazione.

Note - Impostazioni di lettura coerenti influiscono sul consumo utilizzando il doppio delle unità di capacità se impostate su fortemente consistenti.

Performance- Le query offrono prestazioni migliori rispetto alle scansioni grazie alle scansioni che eseguono la scansione dell'intera tabella o dell'indice secondario, con una risposta lenta e un elevato consumo di throughput. Le scansioni funzionano meglio per le tabelle piccole e le ricerche con meno filtri, tuttavia, è possibile progettare scansioni snelle obbedendo ad alcune best practice come evitare attività di lettura improvvise e accelerate e sfruttare le scansioni parallele.

Una query trova un certo intervallo di chiavi che soddisfano una determinata condizione, con prestazioni dettate dalla quantità di dati che recupera piuttosto che dal volume delle chiavi. I parametri dell'operazione e il numero di partite influiscono in modo specifico sulle prestazioni.

Scansione parallela

Le operazioni di scansione eseguono l'elaborazione in sequenza per impostazione predefinita. Quindi restituiscono i dati in porzioni da 1 MB, il che richiede all'applicazione di recuperare la parte successiva. Ciò si traduce in lunghe scansioni per tabelle e indici di grandi dimensioni.

Questa caratteristica significa anche che le scansioni potrebbero non sfruttare appieno il throughput disponibile. DynamoDB distribuisce i dati delle tabelle su più partizioni; e la velocità effettiva della scansione rimane limitata a una singola partizione a causa della sua operazione su partizione singola.

Una soluzione a questo problema viene dalla divisione logica di tabelle o indici in segmenti. Quindi i segmenti di scansione paralleli (simultaneamente) dei "lavoratori". Utilizza i parametri di Segment eTotalSegments per specificare i segmenti analizzati da determinati lavoratori e specificare la quantità totale di segmenti elaborati.

Numero lavoratore

È necessario sperimentare i valori di lavoro (parametro Segment) per ottenere le migliori prestazioni dell'applicazione.

Note- Le scansioni parallele con grandi gruppi di lavoratori influiscono sulla velocità effettiva consumando probabilmente tutta la velocità effettiva. Gestisci questo problema con il parametro Limit, che puoi utilizzare per impedire a un singolo lavoratore di consumare tutta la velocità effettiva.

Quello che segue è un esempio di scansione approfondita.

Note- Il seguente programma può assumere un'origine dati creata in precedenza. Prima di tentare l'esecuzione, acquisire le librerie di supporto e creare le origini dati necessarie (tabelle con caratteristiche richieste o altre fonti di riferimento).

Questo esempio utilizza anche Eclipse IDE, un file delle credenziali AWS e AWS Toolkit all'interno di un progetto 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()); 
      }     
   } 
}