如何在 DynamoDB 查询中计算消耗的读取容量单位
How are consumed read capacity units calculated in DynamoDB query
我看过亚马逊的页面,了解到 1 个 RCU 是一个 4KB 的项目。
如果我有一个包含 50 个项目的 table,我了解到扫描将读取完整的 50 个项目并使用 50 个 RCU。但是假设我做了一个查询,我的 table 是 10 x 5,它还会使用 50 RCU 吗?
扫描包含 50 个项目的 table 仅当 50 个项目的总大小加起来等于 200KB(对于强一致性读取,或 400KB 对于最终一致性读取)时,才会消耗 50 个 RCU。大多数项目都没有那么大,因此 50 个项目通常只需要大约 10KB 的存储空间,这意味着对 table 的 50 个项目进行全面扫描,并最终保持一致,只需花费大约 3 个 RCU。
消耗的读取容量单位 (RCU) 取决于多种因素:
- 操作(即获取与Query/Scan)
- 项目的大小
- 读取是否strongly consistent or eventually consistent
如果使用 GetItem 操作读取项目,则根据项目大小(即 200B 项目和3KB 的项目每个将消耗 1RCU,而 5KB 的项目将消耗 2RCU)
如果您使用 Query 或 Scan 操作读取多个项目,则消耗的容量取决于项目的累积大小 accessed(即使是使用过滤器时从查询或扫描中过滤掉的项目,您也会被收取费用)。因此,如果您的查询或扫描访问 10 个项目,每个项目的大小约为 200 字节,那么它将仅消耗 1 个 RCU。如果您阅读 10 条,但每条大小约为 5KB,则总消耗容量将为 13 RCU(50KB / 4KB = 12.5,四舍五入,为 13)
此外,如果您执行最终一致性读取,那么您可以将每个容量单位的大小加倍。所以读取 10 个 5KB 项目只需要 7 个 RCU。
您可以在此处阅读 more about throughput capacity。
有几点需要注意:
- 单个项目可能大到 400KB,因此读取一个项目可能会消耗多达 100 个 RCU。
- 计算项目大小时,属性名称也计入项目大小,而不仅仅是它们的值!
Query—Reads multiple items that have the same partition key value. All
items returned are treated as a single read operation, where DynamoDB
computes the total size of all items and then rounds up to the next 4
KB boundary. For example, suppose your query returns 10 items whose
combined size is 40.8 KB. DynamoDB rounds the item size for the
operation to 44 KB. If a query returns 1500 items of 64 bytes each,
the cumulative size is 96 KB.
参考:https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/ProvisionedThroughput.html
Smoke 使用复合主键和配置容量以及最终一致性对以下条目进行了测试:
条目#1(大小 ~ 200B):
散列键 = foo,
范围键 = foobar
条目 #2(大小 ~ 5KB):
散列键 = foo,
范围键 = foojar
对 table 的查询和报告的 RCU 消耗:
- 散列键等于“foo”和范围键BEGINS_WITH“foo”--> 返回的条目和 1 个消耗的 RCU
- 散列键等于“foo”和范围键BEGINS_WITH“foobar”--> 返回大小为 ~ 200B 的条目并消耗 0.5 个 RCU
- 散列键等于“foo”和范围键BEGINS_WITH“fooojar”--> 返回大小为 ~ 5KB 的条目并消耗 1 个 RCU
正如已经推测的那样,这表明访问的项目是与整个复合键匹配的项目,而不仅仅是哈希键。
相比之下,如果您只是通过散列键查询项目,然后过滤到单个项目 --> 它会访问分区中的所有项目并仍然消耗 1 个 RCU。
我看过亚马逊的页面,了解到 1 个 RCU 是一个 4KB 的项目。
如果我有一个包含 50 个项目的 table,我了解到扫描将读取完整的 50 个项目并使用 50 个 RCU。但是假设我做了一个查询,我的 table 是 10 x 5,它还会使用 50 RCU 吗?
扫描包含 50 个项目的 table 仅当 50 个项目的总大小加起来等于 200KB(对于强一致性读取,或 400KB 对于最终一致性读取)时,才会消耗 50 个 RCU。大多数项目都没有那么大,因此 50 个项目通常只需要大约 10KB 的存储空间,这意味着对 table 的 50 个项目进行全面扫描,并最终保持一致,只需花费大约 3 个 RCU。
消耗的读取容量单位 (RCU) 取决于多种因素:
- 操作(即获取与Query/Scan)
- 项目的大小
- 读取是否strongly consistent or eventually consistent
如果使用 GetItem 操作读取项目,则根据项目大小(即 200B 项目和3KB 的项目每个将消耗 1RCU,而 5KB 的项目将消耗 2RCU)
如果您使用 Query 或 Scan 操作读取多个项目,则消耗的容量取决于项目的累积大小 accessed(即使是使用过滤器时从查询或扫描中过滤掉的项目,您也会被收取费用)。因此,如果您的查询或扫描访问 10 个项目,每个项目的大小约为 200 字节,那么它将仅消耗 1 个 RCU。如果您阅读 10 条,但每条大小约为 5KB,则总消耗容量将为 13 RCU(50KB / 4KB = 12.5,四舍五入,为 13)
此外,如果您执行最终一致性读取,那么您可以将每个容量单位的大小加倍。所以读取 10 个 5KB 项目只需要 7 个 RCU。
您可以在此处阅读 more about throughput capacity。
有几点需要注意:
- 单个项目可能大到 400KB,因此读取一个项目可能会消耗多达 100 个 RCU。
- 计算项目大小时,属性名称也计入项目大小,而不仅仅是它们的值!
Query—Reads multiple items that have the same partition key value. All items returned are treated as a single read operation, where DynamoDB computes the total size of all items and then rounds up to the next 4 KB boundary. For example, suppose your query returns 10 items whose combined size is 40.8 KB. DynamoDB rounds the item size for the operation to 44 KB. If a query returns 1500 items of 64 bytes each, the cumulative size is 96 KB.
参考:https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/ProvisionedThroughput.html
Smoke 使用复合主键和配置容量以及最终一致性对以下条目进行了测试:
条目#1(大小 ~ 200B): 散列键 = foo, 范围键 = foobar
条目 #2(大小 ~ 5KB): 散列键 = foo, 范围键 = foojar
对 table 的查询和报告的 RCU 消耗:
- 散列键等于“foo”和范围键BEGINS_WITH“foo”--> 返回的条目和 1 个消耗的 RCU
- 散列键等于“foo”和范围键BEGINS_WITH“foobar”--> 返回大小为 ~ 200B 的条目并消耗 0.5 个 RCU
- 散列键等于“foo”和范围键BEGINS_WITH“fooojar”--> 返回大小为 ~ 5KB 的条目并消耗 1 个 RCU
正如已经推测的那样,这表明访问的项目是与整个复合键匹配的项目,而不仅仅是哈希键。
相比之下,如果您只是通过散列键查询项目,然后过滤到单个项目 --> 它会访问分区中的所有项目并仍然消耗 1 个 RCU。