DynamoDB在更新表中的项时如何消耗容量



最近我使用DynamoDB构建了一些API。

在名为行星的表中,有一个属性,其形式为List of Maps(Array of Objects(。基本上,属性看起来是这样的。我称它为buildingMap,因为它是一张包含许多建筑的地图。

[
{
id: 'some id',
status: 'processing',
...
},
{
id: 'other id',
status: 'done',
...
}
]

事情是,最初,我指出索引并直接更新数组中的对象,就像使用这种UpdateExpression一样。

REMOVE buildingMap[2]

或类似的UpdateExpression

SET buildingMap[0].#status = :status

我认为这将使DynamoDB消耗更少的容量,而不是我取出整个buildingMap,重写它,然后将整个buildingMap放回

像这个

// Get the item using DynamoDB.DocumentClient
const planet = await docClient.get({
TableName: 'Planet',
Key: { planetId: 'xxxxx' }
}).promise()
// Modify the buildingMap attribute
let buildingMap = planet.Item.buildingMap
buildingMap.splice(0, 1) // remove the first object in the buildingMap
// Write back the update
await docClient.update({
TableName: 'Planet',
Key: { planetId: 'xxxxx' },
UpdateExpression: 'SET buildingMap = :map',
ExpressionAttributeValues: { ':map': buildingMap }
}).promise()

然而,我打印出了两种方法的ConsumerCapacity,结果完全相同!

有人能帮我回答DynamoDB是如何真正计算写入容量&更新表中的项目时读取容量

我的意思是,如果我只更新列表中的一个地图,为什么它会消耗与覆盖整个地图列表相同的容量?

此外,当我选择返回ALL_NEW进行更新时,它仍然消耗与我选择返回UPDATED_NEW时相同的容量。但我认为选择返回ALL_NEW会比UPDATED_NEW消耗更多的读取容量

要修改一个项目,DynamoDB内部需要读取整个项目,对其进行修改并将其写回磁盘,因此您需要为整个项目付费,而不是为您修改的小部分付费。

此外,DynamoDB写入比读取要贵得多,而且它们的价格已经包括了所涉及的(强一致性(读取:如果您有条件表达式或任何ReturnValues选项,则不需要支付额外费用(但请注意,即使条件表达式导致写入未完成,您仍然需要为此付费(。

以下是官方文件中的一些相关引用:

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html

UpdateItem--修改表中的单个项。DynamoDB考虑更新前后项目的大小。所消耗的供应吞吐量反映了这些项目大小中较大的一个。即使只更新项目属性的一个子集,UpdateItem仍将消耗所提供的全部吞吐量(项目大小"之前"one_answers"之后"中较大的一个(。

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#DDB-UpdateItem请求ReturnValues

除了小型网络和接收较大响应的处理开销外,请求返回值没有任何额外成本。没有消耗任何读取容量单位。

最新更新