我有一个包含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')
答案 0 :(得分:1)
您正在执行的扫描会读取DynamoDB表中的每个项目,并在满足指定条件时返回它(segment_id__eq =' xCrKYvnfZlm6VCQ',beat_id__gt = 1,patient_id__eq =' 3854520.edf' )。每次读取(即使项目不符合条件)都会消耗您提供的读取容量。如果您要查找单个记录,则最有效的方法是对DynamoDB使用GetItem或BatchGetItem调用,因为您只会消耗指定项目的读取容量。如果您要检索特定范围的记录,使用Range Key或Global或Local Secondary Index会更高效,这样您就可以Query这些项目,因为您只会消耗符合查询条件的所有项目的读取容量。您能否提供有关表格架构的更多信息?
请参阅此developer guide详细介绍扫描与查询之间的差异。
使用查询的一个示例是,如果segment_id是散列键,则beat_id是范围键。您可以使用指定的segment_id和指定的beat_id范围查询所有记录。这将仅消耗检索这些特定记录所需的读取容量,而不是读取整个表。此外,您可以将查询filter应用于其他属性,例如patient_id,以便只返回您想要的结果。
有关扫描/查询消耗容量的更多详细信息:
查询和扫描最终都是一致的读取,因此一个读取容量单位将允许您以每秒8KB的速度读取。
如果您仍然遇到限制,可以采用以下方法来缓解异常:
有关扫描定价的更多详情:
要确定使用“扫描”或“查询”来读取表中项目所需的读取容量:
要确定使用GetItem或BatchGetItem读取表格中的项目需要多少读取容量:
作为一个例子,假设我的表中有10个项目,它们都是1KB,我计划通过最终的一致操作来检索它们。如果我使用GetItem检索它们,每个单独的项目将消耗1/2读取容量单位,因此总成本将是1/2 * 10 = 5个读取容量单位。如果我通过扫描检索它们,则所有项目的总大小为10KB,这将消耗2个读取容量单位。