dynobase-icon
Dynobase

DynamoDB Performance and Latency: Measure It, Then Reduce It

Lakindu Hewawasam

Written by Lakindu Hewawasam

Last updated: October 23rd, 2026

Investigating throttling or capacity? Dynobase shows a table's CloudWatch metrics next to its data, tails DynamoDB Streams and can refresh results automatically. Metrics and streams in Dynobase

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

OperationWhat its latency depends on
GetItem, PutItem, UpdateItem, DeleteItemOne item, so mainly item size and network. Strongly consistent reads might have higher latency than eventually consistent ones.
QueryHow much data each page reads (up to 1 MB) and how many pages you fetch. A filter expression doesn't reduce the data read.
ScanReads the whole table or index 1 MB at a time, so on a large table it takes seconds to hours, not milliseconds.
BatchGetItem, BatchWriteItemMany items in one round trip. The call returns when every item is done, and throttled items come back unprocessed for you to retry.
TransactWriteItems, TransactGetItemsEvery item is read or written twice (prepare and commit), and a conflict cancels the call (TransactionCanceledException).
GSI readsSame 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, MRSCWrites and strongly consistent reads wait for another Region, so they are slower than in a single-Region table.
DAX cache hitEventually 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:

MetricWhat it tells you
ConsumedReadCapacityUnits, ConsumedWriteCapacityUnitsLoad on the table or GSI, to compare with provisioned capacity or your usual peak
ReadThrottleEvents, WriteThrottleEvents and the per-cause throttle metricsThrottled requests, which turn into retries and therefore latency
SystemErrorsHTTP 500 responses, which the SDK retries before your code sees them
UserErrorsHTTP 400 responses for the whole account and Region, such as validation errors
TransactionConflictItem-level requests rejected because a concurrent transaction touched the same item
ReturnedItemCountItems returned by Query, Scan and PartiQL selects, a hint for oversized pages
ReplicationLatencyHow 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 needed AWS_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. ProjectionExpression trims what comes back over the network, though you still pay read capacity for the full items.
  • Scans and filters. A Scan reads every item, and a FilterExpression is 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

  1. Reuse clients and connections, and keep the SDK current.

  2. Set timeouts so a stuck request fails fast and gets retried instead of hanging:

  3. Read by key. Design keys and GSIs so every frequent access pattern is a GetItem or a Query, not a Scan.

  4. Use eventually consistent reads wherever a read doesn't have to see a write from the last second.

  5. Keep items small. Store large blobs in Amazon S3 with a pointer in the item, and return only the attributes you need.

  6. Fetch in parallel. Send independent reads concurrently, or batch them with BatchGetItem, instead of one after another.

  7. Pre-warm before known peaks with warm throughput, so the table doesn't throttle while it scales.

  8. 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.

  9. 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?

DynamoDB is designed for single-digit millisecond latency on single-item reads and writes, measured inside the service by the 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?

No. The DynamoDB SLA covers availability only: 99.99% per Region, or 99.999% for global tables. There is no contractual commitment on request latency or on global table replication lag.

How do I see DynamoDB p99 latency?

Use the CloudWatch metric 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?

The usual causes are reading too much data (a 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?

Put DynamoDB Accelerator (DAX) in front of the table. DAX serves cached, eventually consistent reads from memory in microseconds and uses the same API calls. Strongly consistent reads and writes still go to DynamoDB at millisecond latency.

Dynobase is a Professional GUI Client for DynamoDB

Start your 7-day free trial today

Product Features

Download
/
Pricing
/
Member Portal
/
Privacy
/
EULA
/
Twitter
© 2026 Dynobase