如何获取 DynamoDB 表的大小和项数
没有一个可以廉价地指向 DynamoDB 表的 SELECT COUNT(*)。对于"这张表有多大?",DynamoDB 给你两种截然不同的答案:一个免费的估计值,可能滞后长达六小时;以及一个精确计数,代价是把整张表完整读一遍。大多数"为什么我的项数不对?"的困惑,都源于选了其中一个却期待另一个的行为。
如何获取一张 DynamoDB 表的项数和大小?
调用 DescribeTable:它免费返回 ItemCount 和 TableSizeBytes,但"DynamoDB 大约每六小时更新一次该值。最近的更改可能不会反映在该值中"(AWS API 参考)。要拿到精确数字,运行一次带 --select COUNT 的 Scan——它只返回计数,但会读取(并计费)每一个项。像 DynoTable 这样的图形界面会在每张表上显示这些估计值,并能按需计算精确计数。
| 你想要 | 用 | 成本 | 新鲜度 |
|---|---|---|---|
| 大致的计数 + 大小,免费 | DescribeTable | 无(元数据调用) | 约 6 小时滞后 |
| 精确的总计数 | 带 Select COUNT 的 Scan | 读取整张表 | 实时 |
| 单个键的精确计数 | 带 Select COUNT 的 Query | 读取匹配的项 | 实时 |
| 某个筛选子集的计数 | Scan/Query + 筛选 + COUNT | 读取所有_被扫描_的内容 | 实时 |
方法 1:DescribeTable(免费,约 6 小时滞后)
DescribeTable 是一次元数据查询——它不读取任何项,因此不消耗读取容量,而且它正好携带你要的那两个数字:
aws dynamodb describe-table --table-name Orders \
--query 'Table.[ItemCount, TableSizeBytes]'两个数字都带着同一条告诫,逐字出自 API 参考:"DynamoDB 大约每六小时更新一次该值。最近的更改可能不会反映在该值中。"所以一张你刚刚批量灌入数据的表可能连续几小时报告 ItemCount: 0——这个数字没有错,它只是一个快照。
同一个响应还携带逐索引的数字:每个 GSI 和 LSI 都以同样的六小时节奏报告自己的 ItemCount 和 IndexSizeBytes。把一个 的项数与整张表的项数对比,是一次不错的免费健康检查——它告诉你实际携带索引键的项有多少。
方法 2:用 Scan + Select COUNT 精确计数
当"大约,截至今天早上"还不够好时,就来真的:
aws dynamodb scan --table-name Orders --select COUNT运行之前要知道的事实,全部出自 Scan API 参考:
COUNT"返回匹配项的数量,而不是匹配项本身"——网络流量更少,但"这与获取这些项消耗相同数量的读取容量单位"。对一张 100 GB 的表做精确计数,账单上就是一次 100 GB 的读取。- 单次请求仍然在扫描到 1 MB 数据时打住;响应里的
Count"只返回单个扫描请求所对应的项数"。CLI 会替你沿LastEvaluatedKey翻页并把各页加总;在 SDK 代码里你要自己循环相加——参见分页。 - 在大表上,用并行扫描(
--segment/--total-segments)拆分工作,再把各段的计数加起来。
对子集计数
- 单个分区键下的项:带
--select COUNT的Query——只读取该键下的项,数据有多小它就有多便宜。这是给一个 计数的正确方式。 - 匹配某个筛选的项:加一个
FilterExpression——但记住你被计费的数量是ScannedCount,不是Count:DynamoDB 是在读取_之后_才筛选的,所以通过带筛选的扫描去"数已归档的订单",要为每一个订单付费。一个很高的ScannedCount挨着一个很小的Count,正是这个筛选想变成一个 GSI 的信号——参见筛选策略。
对于更丰富的问题——按状态计数、求和、平均——DynamoDB 完全没有 GROUP BY;各种变通办法在计数、求和与聚合。
DynoTable 中的表大小和项数
DynoTable 把两种答案都放在你正在看的地方。每张打开的表在标签页工具栏里都有一个 Stats(统计)按钮(柱状图图标);面板显示:
- 主键和二级索引——一眼看清表的形状。
- 项数 · 大小 · 平均项大小——DynamoDB 自己的
DescribeTable估计值,明确标注为估计值,六小时的告诫悬停即见。 - Index table(索引表)——一次一键的抽样扫描,发现你的项实际携带的每一个属性(包括
commonData.status这样的嵌套路径),带实时进度。它驱动字段自动补全和推断出的 TypeScript / Zod / JSON Schema 导出,并且会产生正常的 DynamoDB 读取费用——应用会事先明说。

至于精确数字,内置的 AI 助手可以按需在整张表上计算计数、求和与按组细分——它读取每一个匹配的项而不是抽样一页,并且在运行任何消耗读取容量的操作之前都会先询问。
常见问题
为什么我的 DynamoDB 项数不对?
它不是错的——它是陈旧的。ItemCount(和 TableSizeBytes)"大约每六小时"刷新一次,所以最近的写入和删除还没反映出来。控制台的表概览显示的就是同样的 DescribeTable 数字,带着同样的滞后。
如何精确统计 DynamoDB 的行数?
aws dynamodb scan --table-name X --select COUNT——CLI 会翻完整张表并把各页的计数加总。它是精确的,但计费的读取容量与取回每一个项相同。
DescribeTable 免费吗? 它不消耗读取容量——它是元数据调用,不是数据读取,所以轮询它不会碰到你表的吞吐量。
如何知道单个项的大小? DynamoDB 按项大小计量(写入按每 1 KB、读取按每 4 KB 向上取整)。把一个项粘贴进项大小计算器看它的计费大小,上限见 400 KB 项大小限制。
项数会影响我的账单吗?
存储按 TableSizeBytes 计费,请求按项大小 × 请求次数计费——并不直接按项数。把你表的数字填进定价计算器,就能看到按需和预置两种模式下的月度全貌。
想让表的形状、估计值和已索引字段一键可见?下载 DynoTable,在任意表上打开统计面板。


