📜  DynamoDB-扫描

📅  最后修改于: 2020-11-28 14:01:15             🧑  作者: Mango


扫描操作读取所有表项或二级索引。其默认函数导致返回索引或表中所有项目的所有数据属性。在过滤属性中使用ProjectionExpression参数。

每次扫描都会返回结果集,即使没有找到匹配项,结果也将为空。扫描检索不超过1MB,并且可以选择过滤数据。

注意-扫描的参数和过滤也适用于查询。

扫描操作类型

过滤-扫描操作可通过过滤器表达式进行精细过滤,过滤器表达式可在扫描或查询后修改数据;返回结果之前。该表达式使用比较运算符。它们的语法类似于条件表达式,但键属性除外,而过滤器表达式不允许使用键属性。您不能在过滤器表达式中使用分区键或排序键。

注意-1MB限制适用于任何过滤应用。

吞吐量规格-扫描消耗吞吐量,但是,消耗集中在项目大小而不是返回的数据上。无论您是请求每个属性还是仅请求几个属性,使用量都保持不变,并且使用或不使用过滤器表达式也不会影响使用量。

分页-DynamoDB对结果进行分页,从而将结果划分为特定页面。 1MB的限制适用于返回的结果,如果超出限制,则必须再次扫描以收集其余数据。 LastEvaluatedKey值使您可以执行此后续扫描。只需将值应用于ExclusiveStartkey即可。当LastEvaluatedKey值变为null时,该操作已完成所有数据页。但是,非null值并不意味着会自动保留更多数据。仅空值表示状态。

限制参数-限制参数管理结果大小。 DynamoDB使用它来建立返回数据之前要处理的项目数,并且在范围之外不起作用。如果将值设置为x,DynamoDB将返回前x个匹配项。

LastEvaluatedKey值也适用于限制参数产生部分结果的情况。用它来完成扫描。

结果计数-对查询和扫描的响应还包括与ScannedCount和Count有关的信息,这些信息可以量化扫描/查询的项目并量化返回的项目。如果不过滤,则它们的值是相同的。当您超过1MB时,计数仅代表已处理的部分。

一致性-查询结果和扫描结果最终是一致的读取,但是,您也可以设置高度一致的读取。使用ConsistentRead参数更改此设置。

–一致的读取设置在设置为高度一致时会通过使用两倍的容量单位来影响消耗。

性能-查询的性能比扫描更好,这是因为扫描对整个表或二级索引进行了爬网,从而导致响应速度缓慢和大量吞吐消耗。扫描最适合小型表并使用较少的过滤器进行搜索,但是,您可以通过遵循一些最佳实践来设计精益扫描,例如避免突然的,加速的读取活动以及利用并行扫描。

查询查找满足给定条件的特定范围的键,其性能取决于所检索的数据量而不是键的数量。操作的参数和匹配项的数量会特别影响性能。

平行扫描

扫描操作默认情况下按顺序执行处理。然后,它们以1MB的部分返回数据,这提示应用程序提取下一部分。这将导致对大型表和索引的长时间扫描。

此特征还意味着扫描可能不会始终完全利用可用吞吐量。 DynamoDB将表数据分布在多个分区中。并且由于其单分区操作,扫描吞吐量仍然限于一个分区。

解决此问题的方法是将表或索引逻辑上划分为多个段。然后,“工人”并行(同时)扫描段。它使用Segment和TotalSegments的参数指定由某些工作人员扫描的细分,并指定处理的细分总数。

工号

您必须尝试使用worker值(Segment参数)才能获得最佳的应用程序性能。

–具有大量工作程序的并行扫描可能会消耗所有吞吐量,从而影响吞吐量。使用Limit参数管理此问题,您可以使用该参数阻止单个工作人员消耗所有吞吐量。

以下是深度扫描示例。

–以下程序可能假定以前创建的数据源。在尝试执行之前,请获取支持库并创建必要的数据源(具有所需特征的表或其他引用的源)。

此示例还使用Eclipse IDE,AWS凭证文件和Eclipse AWS Java Project中的AWS Toolkit。

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 expressionAttributeValues = new HashMap(); 
      expressionAttributeValues.put(":pr", 100); 
         
      ItemCollection 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 iterator = items.iterator(); 
         
      while (iterator.hasNext()) { 
         System.out.println(iterator.next().toJSONPretty()); 
      }     
   } 
}