DynamoDB - Scan

As operações de varredura lêem todos os itens da tabela ou índices secundários. Sua função padrão resulta no retorno de todos os atributos de dados de todos os itens em um índice ou tabela. Empregue oProjectionExpression parâmetro em atributos de filtragem.

Cada varredura retorna um conjunto de resultados, mesmo sem encontrar correspondências, o que resulta em um conjunto vazio. As varreduras não recuperam mais do que 1 MB, com a opção de filtrar dados.

Note - Os parâmetros e a filtragem das verificações também se aplicam à consulta.

Tipos de operações de varredura

Filtering- As operações de varredura oferecem filtragem fina por meio de expressões de filtro, que modificam os dados após varreduras ou consultas; antes de retornar resultados. As expressões usam operadores de comparação. Sua sintaxe se assemelha às expressões de condição, com exceção dos atributos-chave, que as expressões de filtro não permitem. Você não pode usar uma partição ou chave de classificação em uma expressão de filtro.

Note - O limite de 1 MB se aplica antes de qualquer aplicação de filtragem.

Throughput Specifications- As varreduras consomem a taxa de transferência, no entanto, o consumo se concentra no tamanho do item, e não nos dados retornados. O consumo permanece o mesmo, quer você solicite todos os atributos ou apenas alguns, e o uso ou não de uma expressão de filtro também não afeta o consumo.

Pagination- O DynamoDB pagina os resultados, causando a divisão dos resultados em páginas específicas. O limite de 1 MB se aplica aos resultados retornados e, quando você o excede, outra varredura se torna necessária para reunir o restante dos dados. oLastEvaluatedKeyvalor permite que você execute esta varredura subsequente. Basta aplicar o valor aoExclusiveStartkey. Quando oLastEvaluatedKeyvalor torna-se nulo, a operação concluiu todas as páginas de dados. No entanto, um valor não nulo não significa automaticamente que mais dados permanecem. Apenas um valor nulo indica status.

The Limit Parameter- O parâmetro limite gerencia o tamanho do resultado. O DynamoDB o usa para estabelecer o número de itens a serem processados ​​antes de retornar os dados e não funciona fora do escopo. Se você definir um valor de x, o DynamoDB retornará os primeiros x itens correspondentes.

O valor LastEvaluatedKey também se aplica em casos de parâmetros de limite que produzem resultados parciais. Use-o para concluir varreduras.

Result Count - Respostas a consultas e varreduras também incluem informações relacionadas a ScannedCounte Contagem, que quantifica os itens lidos / consultados e quantifica os itens devolvidos. Se você não filtrar, seus valores serão idênticos. Quando você ultrapassa 1 MB, a contagem representa apenas a parte processada.

Consistency- Os resultados da consulta e da varredura são leituras eventualmente consistentes; no entanto, você também pode definir leituras fortemente consistentes. Use oConsistentRead parâmetro para alterar esta configuração.

Note - As configurações de leitura consistentes afetam o consumo ao usar o dobro das unidades de capacidade quando definidas como fortemente consistentes.

Performance- As consultas oferecem melhor desempenho do que as varreduras, devido às varreduras que rastreiam a tabela inteira ou o índice secundário, resultando em uma resposta lenta e alto consumo de rendimento. As varreduras funcionam melhor para tabelas pequenas e pesquisas com menos filtros; no entanto, você pode criar varreduras enxutas obedecendo a algumas práticas recomendadas, como evitar atividades de leitura aceleradas e repentinas e explorar varreduras paralelas.

Uma consulta encontra um determinado intervalo de chaves que satisfazem uma determinada condição, com desempenho ditado pela quantidade de dados que recupera, e não pelo volume de chaves. Os parâmetros da operação e o número de correspondências afetam especificamente o desempenho.

Varredura paralela

As operações de digitalização executam o processamento sequencialmente por padrão. Em seguida, eles retornam dados em porções de 1 MB, o que faz com que o aplicativo busque a próxima porção. Isso resulta em longas varreduras de tabelas e índices grandes.

Essa característica também significa que as varreduras nem sempre podem explorar totalmente a taxa de transferência disponível. O DynamoDB distribui os dados da tabela em várias partições; e a taxa de transferência da varredura permanece limitada a uma única partição devido à sua operação de partição única.

Uma solução para esse problema vem da divisão lógica de tabelas ou índices em segmentos. Em seguida, os “trabalhadores” verificam os segmentos paralelamente (simultaneamente). Ele usa os parâmetros de segmento eTotalSegments para especificar segmentos verificados por certos trabalhadores e especificar a quantidade total de segmentos processados.

Número do Trabalhador

Você deve experimentar os valores do trabalhador (parâmetro Segment) para obter o melhor desempenho do aplicativo.

Note- Varreduras paralelas com grandes conjuntos de funcionários afetam a produtividade, possivelmente consumindo toda a produtividade. Gerencie esse problema com o parâmetro Limit, que você pode usar para impedir que um único trabalhador consuma todo o rendimento.

A seguir está um exemplo de varredura profunda.

Note- O programa a seguir pode assumir uma fonte de dados criada anteriormente. Antes de tentar executar, adquira bibliotecas de suporte e crie as fontes de dados necessárias (tabelas com as características necessárias ou outras fontes referenciadas).

Este exemplo também usa Eclipse IDE, um arquivo de credenciais AWS e o AWS Toolkit em um projeto 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()); 
      }     
   } 
}