DynamoDB - 扫描

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

每次扫描都会返回结果集,即使找不到匹配项也会导致空集.扫描检索不超过1MB,可选择过滤数据.

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

扫描操作类型

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

注意 : 在任何过滤应用之前适用1MB限制.

吞吐量规格 : 扫描消耗吞吐量,但是,消耗侧重于项目大小而不是返回的数据.无论您是要求每个属性还是只有少数属性,消耗量都保持不变,使用或不使用过滤器表达式也不会影响消费.

分页 :  DynamoDB分页结果导致结果划分为特定页面. 1MB限制适用于返回的结果,当您超过它时,需要进行另一次扫描以收集其余数据. LastEvaluatedKey 值允许您执行此后续扫描.只需将值应用于 ExclusiveStartkey 即可.当 LastEvaluatedKey 值变为null时,操作已完成所有数据页面.但是,非空值不会自动意味着剩余更多数据.只有空值表示状态.

限制参数 :  limit参数管理结果大小. DynamoDB使用它来确定在返回数据之前要处理的项目数,并且不在范围之外工作.如果设置值x,DynamoDB将返回前x个匹配项.

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

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

一致性 : 查询结果和扫描结果最终是一致读取,但是,您也可以设置强一致性读取.使用 ConsistentRead 参数更改此设置.

注意 : 当设置为强一致时,一致的读取设置会使用双倍容量单位来影响消耗.

性能 : 由于扫描爬满整个表或二级索引,查询提供了比扫描更好的性能,导致响应缓慢和吞吐量大.扫描最适合小型表和使用较少过滤器的搜索,但是,您可以通过遵循一些最佳实践来设计精益扫描,例如避免突然,加速读取活动和利用并行扫描.

A查询查找满足给定条件的特定范围的密钥,其性能由其检索的数据量而不是密钥量决定.操作参数和匹配数特别影响性能.

并行扫描

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

此特性还意味着扫描可能无法始终充分利用可用吞吐量. DynamoDB跨多个分区分发表数据;由于单分区操作,扫描吞吐量仅限于单个分区.

此问题的解决方案来自逻辑上将表或索引划分为段.然后"工人"并行(同时)扫描段.它使用Segment和 TotalSegments 的参数来指定某些工作人员扫描的细分,并指定处理的细分总数.

工人编号

您必须尝试使用工作者值(细分参数)以获得最佳的应用程序性能.

注意 : 大量工作人员的并行扫描通过可能消耗所有吞吐量来影响吞吐量.使用Limit参数管理此问题,您可以使用该参数阻止单个工作程序消耗所有吞吐量.

以下是深度扫描示例.

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

此示例还使用Eclipse IDE,AWS凭证文件和Eclipse AWS Java项目中的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<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()); 
      }     
   } 
}