【问题标题】:How are consumed read capacity units calculated in DynamoDB queryDynamoDB 查询中如何计算消耗的读取容量单位
【发布时间】:2018-10-15 03:20:10
【问题描述】:

我在 amazon 上看过该页面,并了解 1 个 RCU 是一个 4KB 的项目。

如果我有一个包含 50 个项目的表,我已经读过一次扫描将读取完整的 50 个项目并使用 50 个 RCU。但是假设我做了一个查询,我的表是 10 x 5,它还会使用 50 RCU 吗?

【问题讨论】:

  • 查询只会消耗返回的item数(假设没有filter,读完后过滤,总大小小于1mb)

标签: amazon-web-services aws-lambda amazon-dynamodb alexa-skills-kit


【解决方案1】:

仅当 50 个项目的总大小等于 200KB(对于强一致性读取,或 400KB 对于最终一致性读取)时,扫描包含 50 个项目的表将消耗 50 个 RCU。大多数项目并没有那么大,因此 50 个项目通常只需要大约 10KB 来存储,这意味着对 50 个项目的表进行完整扫描,最终保持一致性,只需要大约 3 个 RCU。

消耗的读取容量单位 (RCU) 取决于多种因素:

如果使用 GetItem 操作读取项目,则根据项目的大小(即 200B 项目和 3KB 项目将分别消耗1RCU,而一个 5KB 的项目会消耗 2 个 RCU)

如果您使用 QueryScan 操作读取多个项目,则消耗的容量取决于被访问项目的累积大小(即使在使用过滤器时从查询或扫描中过滤出来的项目也会被计费)。因此,如果您的查询或扫描访问 10 个项目,每个项目大小约为 200 字节,那么它将仅消耗 1 个 RCU。如果你读取了 10 个条目,但每个条目的大小约为 5KB,那么总消耗的容量将为 13 个 RCU(50KB / 4KB = 12.5,四舍五入为 13)

此外,如果您执行最终的一致性读取,那么您可以将每个容量单位的大小翻倍。所以读取这 10 个 5KB 的项目只需要 7 个 RCU。

你可以在这里阅读more about throughput capacity

有几点需要注意:

  • 单个项目可能高达 400KB,因此读取一个项目可能会消耗多达 100 个 RCU。
  • 在计算项目大小时,属性名称也计入项目大小,而不仅仅是它们的值!

【讨论】:

  • 有用的总结。但是,我不清楚“访问”是什么意思。如果我基于哈希键进行查询,我的查询是否只能访问具有该键的项目?排序键呢?
  • 正确。查询只会访问特定哈希键的项目
  • 谢谢。如果我还对排序键设置了约束,是否会访问 HashKey 的所有项目,还是只访问与排序键上的约束匹配的项目?
  • 不确定你的意思。查询需要一个哈希键。在该查询中访问的是该哈希键。
  • 我在询问复合键(由散列键 + 排序键组成):多个项目可能具有相同的散列键。运行查询时,我指定哈希键 + 排序键上的约束(例如 BETWEEN 条件),访问哪些项目?具有相同哈希键的所有项目,还是仅匹配排序键约束的项目?
【解决方案2】:

查询 - 读取具有相同分区键值的多个项目。全部 返回的项目被视为单个读取操作,其中 DynamoDB 计算所有项目的总大小,然后四舍五入到下一个 4 KB 边界。例如,假设您的查询返回 10 个项目 组合大小为 40.8 KB。 DynamoDB 将项目大小四舍五入 操作到 44 KB。如果查询返回 1500 项,每项 64 字节, 累积大小为 96 KB。

参考:https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/ProvisionedThroughput.html

【讨论】:

    【解决方案3】:

    Smoke 使用复合主键和预置容量通过以下条目对此进行了测试,并最终实现了一致性:

    • entry#1 (大小 ~ 200B): 哈希键 = foo, 范围键 = foobar

    • 条目#2(大小 ~ 5KB): 哈希键 = foo, 范围键 = foojar

    对表的查询和报告的 RCU 消耗:

    1. hash key EQUALS "foo" AND range key BEGINS_WITH "foo" --> 两个条目都返回和 1 个消耗的 RCUs
    2. 散列键 EQUALS "foo" AND range key BEGINS_WITH "foobar" --> 返回大小约为 200B 的条目并消耗 0.5 个 RCU
    3. 哈希键 EQUALS "foo" AND range key BEGINS_WITH "fooojar" --> 返回大小约为 5KB 的条目并消耗 1 个 RCU

    正如已经推测的那样,这表明访问的项目是匹配整个复合键的项目,而不仅仅是哈希键。

    相比之下,如果您只是通过哈希键查询项目,然后过滤到单个项目-->它将访问分区中的所有项目并仍然消耗 1 个 RCU。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-01
      • 1970-01-01
      相关资源
      最近更新 更多