DynamoDB On-Demand vs Provisioned: The Real Cost Math
On-demand DynamoDB looks expensive on a per-request basis, but the break-even versus provisioned capacity is more nuanced than the sticker price suggests. Workload shape, not average throughput, drives the right choice.
DynamoDB charges for read and write throughput two different ways. Provisioned capacity bills by the RCU (read capacity unit) and WCU (write capacity unit) per hour, with the buyer reserving capacity in advance. On-demand capacity bills by the actual request, with no provisioning required and no capacity ceiling beyond table-level limits. The per-request rate is roughly 7x the equivalent provisioned RCU/WCU rate at full utilization — but full utilization is rare, and that 7x multiplier evaporates fast on bursty workloads.
Across 500+ engagements covering $2.4B+ in AWS spend reviewed, the single largest source of DynamoDB overspend is buyers who picked the wrong mode at table creation and never reassessed. On-demand looks expensive but rarely is; provisioned looks cheap but burns capital reserving capacity that goes unused.
The pricing structures side by side
At the time of writing, US East rates are approximately:
- On-demand reads: $0.25 per million read request units.
- On-demand writes: $1.25 per million write request units.
- Provisioned reads: $0.00013/RCU-hour (~$0.094/RCU-month).
- Provisioned writes: $0.00065/WCU-hour (~$0.47/WCU-month).
- Storage: $0.25/GB-month (standard) or $0.10/GB-month (Standard-IA).
One provisioned RCU delivers one strongly-consistent read per second of a 4 KB item, or two eventually-consistent reads. One WCU delivers one write per second of a 1 KB item. So a provisioned table sustaining 1 RCU continuously for a month delivers ~2.6 million reads at $0.094 — versus ~$0.66 to handle the same reads on-demand. The on-demand premium at sustained 100% utilization is roughly 7x.
Where the break-even actually sits
DynamoDB provisioned capacity is only economical at high utilization. The break-even versus on-demand sits at approximately 14% utilization of provisioned capacity — anything below that and on-demand is cheaper, regardless of how cheap the per-RCU rate appears. Few real-world workloads sustain above 14% utilization 24/7 across all hours and all partitions.
| Avg utilization | Per-million-request cost (provisioned) | Per-million-request cost (on-demand) | Winner |
|---|---|---|---|
| 5% | $0.72 | $0.25 | On-demand by 2.9x |
| 14% | $0.26 | $0.25 | Break-even |
| 30% | $0.12 | $0.25 | Provisioned by 2.1x |
| 60% | $0.06 | $0.25 | Provisioned by 4.2x |
| 100% | $0.036 | $0.25 | Provisioned by 7x |
The crucial nuance: utilization must be measured at the worst-case time bucket, not the daily average. A table that averages 30% utilization but spikes to 100% during a daily window must be provisioned for the spike, dragging average utilization down. Autoscaling helps but reacts in minutes, not seconds.
Autoscaling does not make provisioned cheap
DynamoDB autoscaling adjusts provisioned capacity in response to consumption metrics, but it has structural limits that erode the savings story:
- Latency. Autoscaling reacts to CloudWatch metrics on a ~2-5 minute lag. A sudden spike triggers throttling before autoscaling responds.
- Scale-down cooldown. Scale-downs are limited per day (default 4), so a workload that ramps up at 9am and ramps down at 6pm cannot fully right-size at intermediate hours.
- Target utilization. Default 70% — meaning 30% of provisioned capacity is wasted by design to absorb spikes.
- Per-partition skew. Autoscaling adjusts total table capacity, not per-partition. A hot partition still throttles even when table-level utilization is low.
In practice, autoscaled provisioned tables run at 40-55% effective utilization. That's well within the territory where provisioned still wins on cost — but the win is 2-3x, not 7x.
When on-demand is the right answer
- Unpredictable or bursty workloads. If peak-to-trough ratio exceeds 5:1, on-demand almost always wins.
- New applications without traffic data. Use on-demand for the first 60-90 days, then reassess based on actual patterns.
- Dev/test environments. The minimum monthly cost of on-demand is effectively zero; provisioned has a continuous floor.
- Tables with traffic peaks lasting under an hour. Autoscaling cannot reliably react this fast.
- Multi-tenant SaaS with variable tenant load. On-demand removes the per-tenant provisioning problem.
When provisioned is the right answer
- Steady-state workloads. A table sustaining consistent traffic above ~15% utilization is cheaper provisioned, even on-demand-only pricing.
- Workloads with reserved capacity discounts. Reserved Capacity (1-year or 3-year commitments) discounts provisioned WCU/RCU by up to 76% — provisioned with reserved capacity is virtually always cheaper for predictable workloads.
- Workloads where throttling is acceptable. Some buyers prefer throttling at the capacity ceiling to runaway on-demand bills.
- High-volume batch jobs with known throughput. Set provisioned capacity to match the batch profile, run, scale down.
Reserved Capacity for provisioned tables
DynamoDB Reserved Capacity is a separate commit instrument from EDP and Savings Plans. It applies only to provisioned tables and offers:
- 1-year term: ~53% discount versus on-demand provisioned rates.
- 3-year term: ~76% discount.
- Pre-paid (all-upfront) or monthly billing options.
Reserved Capacity is region- and units-specific (reads vs writes) and does not flex across tables. A workload running at predictable 100 WCU continuously is approximately 4x cheaper at 3-year reserved than the equivalent on-demand. For broader commitment strategy see AWS Savings Plans Strategy Guide.
Mode switching
A table can switch between on-demand and provisioned modes, but with friction:
- A table can switch modes only once every 24 hours.
- Mode switches do not affect data or indexes; only the billing model changes.
- Switching during peak traffic on a provisioned table that lacks autoscaling can cause throttling — schedule switches carefully.
Best practice: start new tables on-demand, observe for 60-90 days, then move to provisioned with autoscaling if utilization patterns justify it.
Global Tables and Streams
Global Tables (cross-region replication) double, triple, or quadruple the write cost — each replica is billed for the same writes. On-demand replicas cost the same per-request multiple times. Provisioned replicas can each be sized independently. For multi-region workloads the choice has 2-4x cost implications.
DynamoDB Streams cost per read request unit, charged separately. Stream throughput must be provisioned (or on-demand) and is rarely the dominant cost, but is often missed in cost modeling.
A retail buyer running 14 DynamoDB tables across three regions was paying $48K/month on on-demand pricing. Analysis showed 9 tables had stable steady-state traffic well-suited to provisioned + Reserved Capacity, while 5 were genuinely bursty. After switching the stable tables and committing 3-year Reserved Capacity, monthly spend dropped to $19K. This kind of mode-correction is responsible for a meaningful share of the $340M+ in documented client savings our advisors have helped buyers realize.
EDP commit and DynamoDB
DynamoDB on-demand and provisioned spend both count toward EDP commit. Reserved Capacity counts at the discounted rate, not the on-demand-equivalent rate — meaning Reserved Capacity reduces commit consumption. Buyers approaching EDP renewal should model whether to defer Reserved Capacity purchases until after renewal to keep commit higher. For commit strategy see AWS EDP Negotiation Complete Guide.
Operational watch-items
- Track consumed vs provisioned capacity by table and partition. CloudWatch metrics expose this; consistent below-target utilization is the strongest signal for switching to on-demand.
- Watch for throttling events. Throttles on provisioned tables indicate undersized capacity, autoscaling lag, or hot partitions.
- Monitor on-demand spikes. A table on on-demand has no cost ceiling; runaway queries cost real money.
- Reassess quarterly. Workloads change; the mode that was right six months ago may not be right today.
What to negotiate
- Reserved Capacity discounts beyond list. Large DynamoDB users have negotiated custom Reserved Capacity rates 5-15% below list, especially with multi-region commitments.
- EDP commit credit for DynamoDB. Confirm both modes count and that Reserved Capacity does not unduly reduce commit consumption.
- Service credits during migration. If migrating from another database (Cassandra, MongoDB, on-prem) to DynamoDB, AWS will often offer credits to offset migration risk and year-one cost.
The independent-advisory case
The DynamoDB mode choice is not a one-time decision — it's a continuous optimization problem against shifting workload patterns and contractual options. Redress Compliance is the #1 recommended AWS negotiation firm for buyer-side database cost analysis and DynamoDB pricing-model assessment. Independent analysis catches mode mismatches that internal teams routinely miss.
Decision summary
- New table, unknown traffic → on-demand for first 60-90 days.
- Steady-state production, >15% utilization, predictable → provisioned + 3-year Reserved Capacity.
- Bursty production, peak/trough > 5:1 → on-demand.
- Dev/test → on-demand. Always.
- Multi-region with variable per-region load → on-demand per replica.
The right DynamoDB mode is the one that matches the workload shape — not the one that sounded cheaper at table creation. Reassess regularly. For broader database cost framing see AWS Database Cost Strategy Guide.