DynamoDB Performance and Latency: Measure It, Then Reduce It

Written by Lakindu Hewawasam
Last updated: October 23rd, 2026
DynamoDB is designed to serve single-item reads and writes in single-digit milliseconds at any scale, measured inside the service. What your application sees is that time plus the network, TLS, SDK work and any retries, so the first step with slow requests is to separate the two. The CloudWatch metric SuccessfulRequestLatency shows DynamoDB's side, with p99 and other percentiles since March 2025, and the gap to your own client-side timing is everything else. For reads that need microseconds, DynamoDB Accelerator (DAX) caches items in memory.
What drives the latency of each operation
| Operation | What its latency depends on |
|---|---|
GetItem, PutItem, UpdateItem, DeleteItem | One item, so mainly item size and network. Strongly consistent reads might have higher latency than eventually consistent ones. |
Query | How much data each page reads (up to 1 MB) and how many pages you fetch. A filter expression doesn't reduce the data read. |
Scan | Reads the whole table or index 1 MB at a time, so on a large table it takes seconds to hours, not milliseconds. |
BatchGetItem, BatchWriteItem | Many items in one round trip. The call returns when every item is done, and throttled items come back unprocessed for you to retry. |
TransactWriteItems, TransactGetItems | Every item is read or written twice (prepare and commit), and a conflict cancels the call (TransactionCanceledException). |
| GSI reads | Same as on the table, but GSIs are eventually consistent: writes reach them within a fraction of a second under normal conditions. |
| Global tables, MREC (default) | Reads and writes are local to the Region. Replication to other Regions usually takes a second or less, with no SLA on it. |
| Global tables, MRSC | Writes and strongly consistent reads wait for another Region, so they are slower than in a single-Region table. |
| DAX cache hit | Eventually consistent reads served from memory in microseconds. |
How to measure DynamoDB latency
On the server: SuccessfulRequestLatency
SuccessfulRequestLatency is the time DynamoDB spent on successful requests, in milliseconds, per table and operation (the TableName and Operation dimensions). It doesn't include network latency or anything that happens in your client. Since March 27, 2025 it supports percentile statistics, so alarm on p99 rather than on Average, which hides the slow tail. You can type custom percentiles such as p99.9 into the CloudWatch statistic field.
The other DynamoDB metrics worth having on the same dashboard:
| Metric | What it tells you |
|---|---|
ConsumedReadCapacityUnits, ConsumedWriteCapacityUnits | Load on the table or GSI, to compare with provisioned capacity or your usual peak |
ReadThrottleEvents, WriteThrottleEvents and the per-cause throttle metrics | Throttled requests, which turn into retries and therefore latency |
SystemErrors | HTTP 500 responses, which the SDK retries before your code sees them |
UserErrors | HTTP 400 responses for the whole account and Region, such as validation errors |
TransactionConflict | Item-level requests rejected because a concurrent transaction touched the same item |
ReturnedItemCount | Items returned by Query, Scan and PartiQL selects, a hint for oversized pages |
ReplicationLatency | How far an MREC global table replica is behind the source Region |
Dynobase shows a table's capacity usage, throttling and latency in a Metrics tab next to its data, if you want them without opening CloudWatch.
In your application
Time the call and look at how many attempts the SDK made. In the AWS SDK for JavaScript v3 every response carries $metadata.attempts and $metadata.totalRetryDelay, so you can tell a slow DynamoDB from a request that was retried:
If your timing is far above SuccessfulRequestLatency for the same operation, the time is going to connection setup, the network path, retries or your own code, not to DynamoDB.
What makes DynamoDB requests slow
- New connections. For a short call such as a
GetItem, opening a TCP and TLS connection can take longer than the operation itself. Create one client and reuse it; in AWS Lambda, create it outside the handler. The AWS SDK for JavaScript v3 keeps connections alive by default (v2 neededAWS_NODEJS_CONNECTION_REUSE_ENABLED=1). - Distance. Every request from another Region crosses the network twice. Run the application in the table's Region, and use global tables to put a replica near users in other Regions.
- Large items and big pages. Bigger items take longer to read, write and transfer. Attribute names count toward item size, so long names on millions of items add up.
ProjectionExpressiontrims what comes back over the network, though you still pay read capacity for the full items. - Scans and filters. A
Scanreads every item, and aFilterExpressionis applied after the read, so filtering does not reduce read capacity; it can still reduce response size. Query by key or through an index instead; see Scan vs Query. - Throttling. A throttled request is retried with exponential backoff, which shows up as latency long before it shows up as errors. DynamoDB throttling covers the causes and fixes.
- Strong consistency and transactions. Strongly consistent reads cost twice the read units and might be slower. Transactions do two reads or writes per item. Use them where you need them, not by default; see read consistency.
- Under-provisioned GSIs. In provisioned mode, a GSI with less write capacity than its table can throttle, delay propagation to the index, and throttle writes to the table itself. Size each GSI for the writes that affect it and the size of its projected items; a sparse index need not match the table's capacity.
How to reduce latency
Reuse clients and connections, and keep the SDK current.
Set timeouts so a stuck request fails fast and gets retried instead of hanging:
Read by key. Design keys and GSIs so every frequent access pattern is a
GetItemor aQuery, not aScan.Use eventually consistent reads wherever a read doesn't have to see a write from the last second.
Keep items small. Store large blobs in Amazon S3 with a pointer in the item, and return only the attributes you need.
Fetch in parallel. Send independent reads concurrently, or batch them with
BatchGetItem, instead of one after another.Pre-warm before known peaks with warm throughput, so the table doesn't throttle while it scales.
Keep traffic private and direct. A gateway VPC endpoint sends DynamoDB traffic from your VPC without a NAT gateway or internet gateway. Interface endpoints (AWS PrivateLink) also work from on-premises networks, with up to 50,000 requests per second per endpoint.
Cache hot reads. DAX serves cached, eventually consistent reads in microseconds and is API-compatible with DynamoDB.
DynamoDB compared with in-memory stores
DynamoDB keeps every item on SSD-backed storage replicated across three Availability Zones, which is what makes its writes durable and also why it answers in milliseconds rather than microseconds. In-memory services such as DAX and Amazon ElastiCache (Valkey, Redis OSS or Memcached) answer from RAM in microseconds, but they are caches in front of a database, not a replacement for one. If a workload needs both durability and microsecond reads, the usual design is DynamoDB as the source of truth with a cache in front; the comparison pages for DynamoDB vs Redis and DynamoDB vs ElastiCache go through the trade-offs.
Frequently Asked Questions
What is the typical latency of DynamoDB?
SuccessfulRequestLatency metric. Your application also sees network, TLS, SDK and retry time, so client-side numbers are higher, especially across Regions or on new connections.Does DynamoDB have a latency SLA?
How do I see DynamoDB p99 latency?
SuccessfulRequestLatency with the TableName and Operation dimensions and a percentile statistic such as p99, available since March 2025. It measures time inside DynamoDB only, so compare it with your client-side timing.Why is my DynamoDB query slow?
Scan, or a Query whose filter discards most of what it reads), large items, many pages, throttling retries, calls from another Region, and creating a new client or connection per request. Compare SuccessfulRequestLatency with your own timing to see which side the time is on.How can I get microsecond latency with DynamoDB?
Dynobase is a Professional GUI Client for DynamoDB
Start your 7-day free trial today