读取DynamoDB表扫描的容量成本

RTF*_*RTF 10 amazon-web-services amazon-dynamodb

在阅读文档后,我不清楚在使用DynamoDB中的过滤器进行扫描操作期间消耗了多少读取容量单位.例如,使用此ruby请求:

table.items.where(:MyAttribute => "Some Value").each do |item_data|
   # do something with the item_data
end
Run Code Online (Sandbox Code Playgroud)

我的理解是这将导致表扫描,但DynamoDB只返回我感兴趣的项目.但是如果我的表有10000个项目,并且只有5个项目通过我的过滤器,我仍然是对大量读取容量单位"收费"?

我用于过滤器的属性不是散列,范围或二级索引.我最近刚刚添加了该属性,而且出乎意料的是,这就是我不使用查询的原因.

Sma*_*ajl 9

简而言之,您将对扫描的项目总金额(不是退回的项目总金额)"收费".与查询(如您已经提到的)相比,扫描是一项昂贵的操作.

值得一提的是,当您在桌面上调用扫描时,并不意味着将扫描整个表格.如果扫描项目的大小超过1MB的限制,扫描将停止,您必须再次调用它以扫描表格的下一部分.

这取自官方文档:

如果扫描项目的总数超过最大数据集大小限制1 MB,则扫描将停止,并将结果作为LastEvaluatedKey值返回给用户,以在后续操作中继续扫描.结果还包括超出限制的项目数.扫描可能导致没有符合过滤条件的表数据.

在对找到的项目进行扫描后应用过滤器,因此它根本不会影响吞吐量.

如果您要定期执行这些操作,可能需要考虑添加一些二级索引或优化散列和范围键.

  • 如果我的读取容量是 5 个读取单元,那么扫描包含 1000 条记录的表需要多长时间。如果扫描每一项都使用一个读取容量,则需要很长时间才能完成扫描,对吗? (2认同)
  • @iamprem“...完成扫描需要很长时间,对吧?”。不,不会,它仍然会快得令人难以置信。这就是让我困惑的地方。如果您不查询表,AWS 是否会运行您随着时间的推移积累的某种读/写信用额度? (2认同)
  • 请记住,当您扫描或查询时,RCU 的消耗不是基于项目数而是基于项目的总大小。如果有 1000 条记录,每条记录为 40 字节(总共 40,000 字节),则扫描该表将消耗 40,000 / 4,000 * 0.5 = 5 RCU。 (2认同)
  • 我不明白为什么 AWS 或我所知道的任何 SDK 都不提供游标。 (2认同)