0

我有一个包含 segment_id、beat_id、patient_id 的数据库

在 dynamoDB 版本 2 中,当我使用以下命令进行扫描时,我只能获取 1 个特定患者的值。当我输入其他段时,患者值我得到一个 ThroughputExceededException。

table.scan(segment_id__eq='xCrKYvnfZlm6VCQ',beat_id__gt=1,patient_id__eq='3854520.edf')
  1. 为什么它只对 1 名患者有效,而给其他人一个 ThroughputExceededException?
4

1 回答 1

1

您正在执行的扫描会读取 DynamoDB 表中的每个项目,如果满足指定条件(segment_id__eq='xCrKYvnfZlm6VCQ',beat_id__gt=1,patient_id__eq='3854520.edf'),则将其返回。每次读取(即使项目不满足条件)都会消耗您预置的读取容量。如果您要检索单个记录,对 DynamoDB 使用GetItemBatchGetItem调用将是最有效的,因为您只会消耗指定项目的读取容量。如果您要检索特定范围的记录,使用范围键全局本地二级索引会更有效,以便您可以查询这些项目,因为您只会消耗所有满足查询条件的项目的读取容量。您能否提供有关表架构的更多信息?

请参阅此开发人员指南,其中详细描述了扫描和查询之间的区别。

使用查询的一个例子是 segment_id 是散列键,beat_id 是范围键。您可以查询具有指定 segment_id 和指定 beat_id 范围的所有记录。这只会消耗检索那些特定记录所需的读取容量,而不是读取整个表。此外,您可以将查询过滤器应用于其他属性,例如 patient_id,以便只返回您想要的结果。

有关扫描/查询消耗容量的更多详细信息:

查询和扫描都是最终一致性读取,因此一个读取容量单元可以让您以高达每秒 8KB 的速度读取。

如果您仍然遇到限制,以下是一些缓解异常的方法:

  1. 增加请求之间的时间,以将您的读取率保持在您预置的读取容量之下。SDK默认重试限制异常。
  2. 增加您的预置读取容量以考虑项目大小和请求率。请参阅这些资源,了解预配置吞吐量的工作原理计算项目大小

有关扫描定价的更多详细信息:

要确定使用 Scan 或 Query 读取表中的项目需要多少读取容量:

  1. 弄清楚您正在阅读多少数据(将要读取的所有项目的大小相加)
  2. 向上舍入到最接近的 4KB 倍数
  3. 除以 4KB(强一致性读取)或 8KB(最终一致性读取)得到将消耗的容量单位数。

要确定使用 GetItem 或 BatchGetItem 读取表中的项目需要多少读取容量:

  1. 对于每个单独的项目,将该项目的大小四舍五入到最接近的 4KB 倍数
  2. 除以 4KB(强一致性读取)或 8kb(最终一致性读取)得到每个单独项目将消耗的容量单位数。
  3. 将每个项目将消耗的容量单位相加,得到将消耗的容量单位总数。

例如,假设我的表中有 10 个项目,它们都是 1KB,我计划通过最终一致的操作来检索它们。如果我使用 GetItem 检索它们,每个单独的项目将消耗 1/2 读取容量单位,因此总成本将为 1/2 * 10 = 5 个读取容量单位。如果我通过扫描检索它们,所有项目的总大小为 10KB,这将消耗 2 个读取容量单位。

于 2014-11-28T22:10:40.867 回答