You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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操作的容量消耗由操作完成后整个项目的总大小决定,而非本次更新的单个属性大小。

  1. 项目总大小超标:
    20 WCUs对应20KB的项目大小(1 WCU支持1KB以内的项目写入)。如果目标项目原本包含其他大属性,或本次更新后整个项目总大小接近20KB,就会触发20 WCUs的消耗。比如你仅更新了string属性,但项目中还有未展示的大字段,叠加后总大小达到20KB级别。

  2. 字符数≠实际字节数:
    你提到的650字符是字符串的字符数,但DynamoDB按字节数统计项目大小。启用WriteIndented = true后,序列化的JSON包含大量空格、换行符,会增加字节数,但即使按每个字符2字节计算,650字符仅1.3KB,远不足以消耗20 WCUs,因此这不是主要原因。

  3. 验证建议:

    • 用GetItem API获取项目完整内容,统计所有属性(包括属性名和值)的总字节数,确认是否接近20KB;
    • 检查项目是否包含隐藏属性(如自动添加的版本字段、未清理的历史属性);
    • 关闭WriteIndented = true,使用紧凑JSON序列化减少string属性字节数,再观察WCU消耗变化。

内容的提问来源于stack exchange,提问作者Joao Lima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:05:03