DynamoDB Update Item操作消耗20 WCUs的原因咨询
问题:DynamoDB UpdateItem 操作消耗20 WCUs的原因排查
场景描述
测试DynamoDB时发起Update Item请求,传入的序列化JSON字符串仅650字符(理论≤1KB),但每次操作消耗20个写入容量单位(WCUs),重复执行4次结果一致。根据官方定义:
A write capacity unit represents one write per second, for an item up to 1 KB in size.
对此存在疑问,相关代码及传入的JSON如下:
示例代码
[ObservableProperty] private ObservableCollection<Project> projects; private async Task SavingCloudFilesToDB() { var options = new JsonSerializerOptions { WriteIndented = true, }; var jsonstring = JsonSerializer.Serialize(Projects, typeof(ObservableCollection<Project>), options); var client = new AmazonDynamoDBClient(credentials); var request = new UpdateItemRequest { TableName = "mytable", Key = new Dictionary<string, AttributeValue> { ["email"] = new AttributeValue { S = user.Email }, }, ExpressionAttributeNames = new Dictionary<string, string>() { {"#string","string"} }, ExpressionAttributeValues = new Dictionary<string, AttributeValue>() { {":string", new AttributeValue { S = jsonstring } } }, UpdateExpression = "SET #string = :string", }; await client.UpdateItemAsync(request); }
传入的JSON内容
[ { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] }, { "Name": "File", "CloudFiles": [] } ]
回答
核心原因:UpdateItem的WCU计算基于整个项目的大小,而非仅更新的属性
DynamoDB的写入容量单位(WCU)计算规则中,UpdateItem操作的容量消耗由操作完成后整个项目的总大小决定,而非本次更新的单个属性大小。
项目总大小超标:
20 WCUs对应20KB的项目大小(1 WCU支持1KB以内的项目写入)。如果目标项目原本包含其他大属性,或本次更新后整个项目总大小接近20KB,就会触发20 WCUs的消耗。比如你仅更新了string属性,但项目中还有未展示的大字段,叠加后总大小达到20KB级别。字符数≠实际字节数:
你提到的650字符是字符串的字符数,但DynamoDB按字节数统计项目大小。启用WriteIndented = true后,序列化的JSON包含大量空格、换行符,会增加字节数,但即使按每个字符2字节计算,650字符仅1.3KB,远不足以消耗20 WCUs,因此这不是主要原因。验证建议:
- 用
GetItemAPI获取项目完整内容,统计所有属性(包括属性名和值)的总字节数,确认是否接近20KB; - 检查项目是否包含隐藏属性(如自动添加的版本字段、未清理的历史属性);
- 关闭
WriteIndented = true,使用紧凑JSON序列化减少string属性字节数,再观察WCU消耗变化。
- 用
内容的提问来源于stack exchange,提问作者Joao Lima
相关产品推荐
相关产品推荐

