DynamoDB LSI item collection 10 GB limit

TL;DR — 在一张带本地二级索引的表上,一个_项目集合_——每个共享一个分区键的项目,加上它们的 LSI 投影——合计最多 10 GB。只有 LSI 表才有这个上限,因为每个项目集合必须容纳在单个分区上。一次会把集合推过 10 GB 的写入会以 ItemCollectionSizeLimitExceededException 失败。监控 ItemCollectionMetrics、重新分片增长的键,或者用 GSI(它没有这样的限制)替换 LSI。

含义

ItemCollectionSizeLimitExceededException: Collection size exceeded.

一个项目集合是表及其所有 LSI 中具有相同分区键值的所有项目的集合。当一张表有 LSI 时,DynamoDB 把每个项目集合存储在单个分区上,因此集合受该分区 10 GB 容量的限制。没有 LSI 的表没有逐集合的大小限制(GSI 也没有)。所以这个错误是一个信号:某个分区键的数据在一个 LSI 下无界地增长了。它是一个 HTTP 400;AWS 把它列为可重试,但重试只有在集合缩小后才会成功——读取和缩减大小的写入(删除、修剪属性)仍然被允许。

为什么会发生

  • 一个无界的分区键——一个大租户、一个繁忙的用户,或一个仅追加的日志都在一个键下写入。
  • LSI 本身——10 GB 上限_只_因为表有一个 LSI 才存在(在表创建时创建且不可移除)。
  • 宽的 LSI 投影——把许多属性投影进 LSI 会更快地膨胀集合。
  • 稳步增长,悄悄逼近 10 GB,直到一次写入最终越过它。

如何修复

  1. 重新分片分区键。 把过大的实体跨多个键拆分(TENANT#42#1TENANT#42#2……),使得没有单个集合无界地增长。
  2. 用 GSI 替换 LSI。 GSI 有它们自己的分区键且没有项目集合大小限制——对大多数访问模式而言,GSI 更合适,而且它可以在表创建后添加/移除(LSI 不行)。
  3. 修剪 LSI 投影——如果你必须保留 LSI,就投影更少的属性(KEYS_ONLY/INCLUDE)以减缓集合增长。
  4. 把冷项目归档出热集合到另一张表或 S3。
  5. 在撞墙之前监控。 在写入(PutItemUpdateItemDeleteItemBatchWriteItemTransactWriteItems)上设置 ReturnItemCollectionMetrics: SIZE;DynamoDB 会返回一个 SizeEstimateRangeGB 估计值,AWS 建议在一个用户定义的阈值(例如 8 GB)上告警,让你在 10 GB 之前采取行动。

在重做键和索引以摆脱 LSI 限制?DynoTable 桌面应用让你按分区键过滤,这样你就能在重新分片之前看到哪个集合过大了。

从 DynoTable

找到接近 10 GB 的分区键 — 使用 ⌘K 打开表,按分区键排序,并对每个集合的项目进行计数。当广泛的 LSI 预测导致馆藏膨胀时,item size calculator 估计会出现增长。将 LSI 写入成本与 GSI 迁移与 pricing calculator 进行比较。使用 ⌘P 切换配置文件;参见连接 AWS安装

来源

相关错误

参考资料

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。