DynamoDB 成本模型:为什么 SQL 会隐藏账单
对 DynamoDB 运行真正的 SQL 很强大——你能在一个原生一样都不提供的数据库上,用到 JOIN、GROUP BY 和任意的 WHERE 子句。但 SQL 是为一个带有查询规划器、且每一列都有二级索引的引擎设计的,而 DynamoDB 两者都没有。一条完全合法的 SELECT 可能编译成一次全表 Scan,读取——并向你计费——表中的每一个条目。
这就是 SQL 抽象的双刃剑:它让昂贵的访问模式看起来免费。本指南会讲清楚底层的成本模型,好让这份便利永远不会变成一张意外的账单,并展示 DynoTable 如何在你运行查询之前就把成本呈现出来。
为什么在 DynamoDB 上用 SQL 的花费比看起来更多?
关系型数据库能高效地回答 WHERE status = 'active',因为它会为你查询的任意列建立索引。DynamoDB 不会。它只对一件事高效:分区键(可选地由排序键或全局二级索引进一步收窄)。除此之外的一切都是 Scan。
- 分区键等值条件就是一次 Query。DynamoDB 直接跳到该键下的条目,只读取那些条目。范围有界且便宜。
- 除此之外的一切都是 Scan + Filter。DynamoDB 会读取表中的每一个条目,然后把你的
WHERE作为FilterExpression应用——在读取之后。你要为它扫描的所有内容付费,而不是为返回的那少数几行付费。
最后这一点就是陷阱。WHERE 子句看起来像是在缩减工作量。但在非键属性上,它只缩减输出——读取成本早已花掉了。
Query 对比 Scan:RCU 计算
DynamoDB 以读取容量单位(RCU)计费:
- 1 RCU = 一次对最大 4 KB 条目的强一致性读取。最终一致性读取花费半个单位。读取按每 4 KB 向上取整。
- 一次 Query 只读取单个分区键下的条目——成本随匹配的条目数而变,而不是随整张表。
- 一次 Scan 会读取整张表,每次 4 KB。一张 1 GB 的表,单次完整遍历大约需要 262,000 个最终一致性 RCU——每次遍历,每一次都如此。
FilterExpression 不会减少这个数字。过滤发生在读取之后,所以带过滤的 Scan 花费与不带过滤的完全相同。用条目大小计算器和定价计算器算出你自己数据的真实数字。
哪些 SQL 结构会悄悄变成 Scan?
- 不含分区键等值条件的
WHERE→ 一次带读取后过滤的全表 Scan。 JOIN→ DynamoDB 没有服务端连接。每张被连接的表都会被单独获取,然后在客户端拼接起来——这是一种 N+1 访问模式,每一个被连接的行都要一次请求。COUNT、SUM、GROUP BY及聚合 → 不存在服务端聚合,所以每一个匹配的条目都会被读取。在 Scan 之上,这意味着读取整张表。- 在非键属性上的
ORDER BY或DISTINCT→ 排序和去重会在客户端对扫描到的内容进行。
运行这些操作都没有错——有时 Scan 正是你想要的。关键在于知道自己什么时候在运行它。
我该如何让 SQL 如实反映成本?
- 围绕你的访问模式来设计键。最便宜的查询,就是你的键 schema 已经能回答的那一个。用单表设计工具和 Query 对比 Scan 指南来规划它。
- 在
WHERE中放入一个分区键等值条件,以得到 Query 而不是 Scan。 - 添加一个 GSI 来支持第二种访问模式,而不是扫描再过滤。
- 在运行前先读一读成本。DynoTable 的 Workbench 会把你的 SQL 编译成实际的 DynamoDB 操作并展示计划——Scan 对比 Query、它使用哪个索引、键条件对比扫描后的过滤,以及一个估算的 RCU 成本——然后就地标记全表 Scan 和 N+1 JOIN。它就是 DynamoDB 从未推出过的那个
EXPLAIN。另见为什么 Scan 又慢又贵和按需容量 vs 预置容量。
DynoTable 的 SQL 会让成本问题变得更糟吗?
不会——因为它让成本变得可见。对「在 DynamoDB 上用 SQL」的批评是有道理的:一个隐藏扫描的抽象会让你搬起石头砸自己的脚。DynoTable 的回应不是去掉 SQL,而是在它背后放上一台成本 X 光机。Workbench 中的每个查询都会在运行前预览它真实的 DynamoDB 形态,这样你既能保留 SQL 的顺手,又能拥有原生模型给你的、对 RCU 和键设计的诚实。
这些我需要用到 AI 智能体吗?
不需要——表查看器、SQL Workbench 和成本预览都能在没有它的情况下完整工作。AI 智能体是 DynoTable 的招牌功能之一——一个 DynamoDB 原生的编码智能体,能编写感知 schema 的查询、转换数据等等——只要你需要,它随时都在。它运行在你自己的 AWS Bedrock 上,所以你直接按成本价向 AWS 付费(没有加价),而且你的数据永远不会离开你的账户。有帮助时就把它打开;无论开不开,核心客户端都是完整的。
我的工作成果可以带走吗?
可以。DynoTable 讲的是标准,而不是围墙花园:标准 SQL、标准的 AWS 凭证与 SSO、CSV/JSON 导出、推断 schema 导出为 TypeScript、JSON-Schema 或 Zod,还有一个 MCP 服务器,让你自己的工具和智能体能够连接。你的查询、配置和 schema 都能干净地导出——没有任何东西被锁定。
试试看
下载 DynoTable,对着你自己的表打开 SQL Workbench——成本预览会在你运行每个查询之前,告诉你它真正的花费。