入门阅读约 1 分钟

如何获取 DynamoDB 表的大小和项数

没有一个可以廉价地指向 DynamoDB 表的 SELECT COUNT(*)。对于"这张表有多大?",DynamoDB 给你两种截然不同的答案:一个免费的估计值,可能滞后长达六小时;以及一个精确计数,代价是把整张表完整读一遍。大多数"为什么我的项数不对?"的困惑,都源于选了其中一个却期待另一个的行为。

如何获取一张 DynamoDB 表的项数和大小?

调用 DescribeTable:它免费返回 ItemCountTableSizeBytes,但"DynamoDB 大约每六小时更新一次该值。最近的更改可能不会反映在该值中"(AWS API 参考)。要拿到精确数字,运行一次带 --select COUNTScan——它只返回计数,但会读取(并计费)每一个项。像 DynoTable 这样的图形界面会在每张表上显示这些估计值,并能按需计算精确计数。

你想要成本新鲜度
大致的计数 + 大小,免费DescribeTable无(元数据调用)约 6 小时滞后
精确的总计数Select COUNTScan读取整张表实时
单个键的精确计数Select COUNTQuery读取匹配的项实时
某个筛选子集的计数Scan/Query + 筛选 + COUNT读取所有_被扫描_的内容实时

方法 1:DescribeTable(免费,约 6 小时滞后)

DescribeTable 是一次元数据查询——它不读取任何项,因此不消耗读取容量,而且它正好携带你要的那两个数字:

aws dynamodb describe-table --table-name Orders \
  --query 'Table.[ItemCount, TableSizeBytes]'

两个数字都带着同一条告诫,逐字出自 API 参考:"DynamoDB 大约每六小时更新一次该值。最近的更改可能不会反映在该值中。"所以一张你刚刚批量灌入数据的表可能连续几小时报告 ItemCount: 0——这个数字没有错,它只是一个快照。

同一个响应还携带逐索引的数字:每个 GSI 和 LSI 都以同样的六小时节奏报告自己的 ItemCountIndexSizeBytes。把一个 的项数与整张表的项数对比,是一次不错的免费健康检查——它告诉你实际携带索引键的项有多少。

方法 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 COUNTQuery——只读取该键下的项,数据有多小它就有多便宜。这是给一个 计数的正确方式。
  • 匹配某个筛选的项:加一个 FilterExpression——但记住你被计费的数量是 ScannedCount,不是 Count:DynamoDB 是在读取_之后_才筛选的,所以通过带筛选的扫描去"数已归档的订单",要为每一个订单付费。一个很高的 ScannedCount 挨着一个很小的 Count,正是这个筛选想变成一个 GSI 的信号——参见筛选策略

对于更丰富的问题——按状态计数、求和、平均——DynamoDB 完全没有 GROUP BY;各种变通办法在计数、求和与聚合

DynoTable 中的表大小和项数

DynoTable 把两种答案都放在你正在看的地方。每张打开的表在标签页工具栏里都有一个 Stats(统计)按钮(柱状图图标);面板显示:

  • 主键和二级索引——一眼看清表的形状。
  • 项数 · 大小 · 平均项大小——DynamoDB 自己的 DescribeTable 估计值,明确标注为估计值,六小时的告诫悬停即见。
  • Index table(索引表)——一次一键的抽样扫描,发现你的项实际携带的每一个属性(包括 commonData.status 这样的嵌套路径),带实时进度。它驱动字段自动补全和推断出的 TypeScript / Zod / JSON Schema 导出,并且会产生正常的 DynamoDB 读取费用——应用会事先明说。
DynoTable 中的表统计面板:键与索引、项数 / 大小 / 平均项大小估计行,以及已索引字段列表。
DynoTable 中的表统计面板:键与索引、项数 / 大小 / 平均项大小估计行,以及已索引字段列表。

至于精确数字,内置的 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,在任意表上打开统计面板。

更新于