扫描操作读取所有表项或二级索引.其默认函数导致返回索引或表中所有项的所有数据属性.在过滤属性中使用 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); MapexpressionAttributeValues = 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()); } } }