What are the item size limits and other quotas in DynamoDB?
Learn DynamoDB's 400 KB item limit, key sizes, batch and transaction caps, the 1 MB query limit, and how to model data around these quotas.
Expected Interview Answer
DynamoDB caps a single item at 400 KB (attribute names plus values combined), and enforces further quotas such as a 2048-byte partition key, 1024-byte sort key, up to 100 items or 16 MB per BatchGetItem, and 25 items per BatchWriteItem or TransactWriteItems.
These limits shape data-modeling decisions: large blobs go to S3 with only a pointer stored in the item, and one-to-many relationships that could exceed 400 KB must be split across multiple items rather than a single large attribute or list. A query returns at most 1 MB of data per call before you must paginate with LastEvaluatedKey, secondary indexes are limited (20 GSIs and 5 LSIs per table by default), and on-demand or provisioned throughput has its own per-partition ceiling of roughly 3000 RCU and 1000 WCU.
- Forces predictable, low-latency access patterns
- Encourages offloading large blobs to S3
- Keeps per-request cost and latency bounded
- Prevents hot, oversized items from degrading a partition
- Makes capacity planning deterministic
AI Mentor Explanation
Think of DynamoDB item limits like the strict equipment and boundary rules in cricket: a bat has a maximum legal width and depth, an over is exactly six balls, and the boundary rope sits at a fixed distance. You cannot cram an eighth ball into an over just because you want more runs, and you cannot use an oversized bat. The 400 KB item cap and the 25-item batch rule are those same hard boundaries — the game only works because everyone plays inside fixed dimensions.
Step-by-Step Explanation
Step 1
Know the 400 KB item ceiling
The combined size of all attribute names and values in one item must stay under 400 KB, so estimate serialized size when modeling.
Step 2
Respect key size limits
Partition key values are capped at 2048 bytes and sort key values at 1024 bytes, which constrains composite key designs.
Step 3
Plan batch and transaction sizes
BatchGetItem takes up to 100 items or 16 MB, BatchWriteItem 25 items, and TransactWriteItems/TransactGetItems 100 items each per call.
Step 4
Paginate query and scan results
Each Query or Scan returns at most 1 MB; use LastEvaluatedKey to fetch subsequent pages.
Step 5
Offload large data
Store blobs larger than practical in S3 and keep only the object key plus metadata in the DynamoDB item.
Step 6
Watch index and throughput quotas
Default limits include 20 GSIs and 5 LSIs per table and ~3000 RCU / 1000 WCU per partition before throttling.
What Interviewer Expects
- Knowing the exact 400 KB item limit
- Awareness of partition and sort key byte limits
- Batch and transaction item counts
- The 1 MB per-page query/scan limit and pagination
- The S3-pointer pattern for large objects
- Which quotas are soft (adjustable) versus hard
Common Mistakes
- Claiming items can be several MB in size
- Storing large binary blobs directly instead of in S3
- Forgetting that a query returns only 1 MB per call
- Confusing BatchWriteItem's 25-item cap with BatchGetItem's 100
- Assuming all quotas are hard limits when many are adjustable via Service Quotas
Best Answer (HR Friendly)
“DynamoDB puts firm size limits on your data — each record can hold up to 400 KB, and operations that read or write many records at once are capped per call. Anything bigger, like images or documents, is kept in S3 storage while DynamoDB just stores a link to it, which keeps the database fast and predictable.”
Code Example
// Upload the big blob to S3, store only the key in DynamoDB
await s3.putObject({
Bucket: 'my-app-assets',
Key: `reports/${reportId}.pdf`,
Body: pdfBuffer,
}).promise()
await ddb.putItem({
TableName: 'Reports',
Item: {
reportId: { S: reportId },
s3Key: { S: `reports/${reportId}.pdf` },
sizeBytes: { N: String(pdfBuffer.length) },
},
}).promise()
// Item stays well under the 400 KB limitlet items = []
let lastKey
do {
const res = await ddb.query({
TableName: 'Orders',
KeyConditionExpression: 'customerId = :c',
ExpressionAttributeValues: { ':c': { S: customerId } },
ExclusiveStartKey: lastKey,
}).promise()
items = items.concat(res.Items)
lastKey = res.LastEvaluatedKey
} while (lastKey)Follow-up Questions
- How do you store objects larger than 400 KB with DynamoDB?
- What is the difference between BatchWriteItem and TransactWriteItems limits?
- Which DynamoDB quotas are soft and can be raised via Service Quotas?
- How does the 1 MB query limit affect pagination design?
- What are the default limits on GSIs and LSIs per table?
MCQ Practice
1. What is the maximum size of a single DynamoDB item?
A DynamoDB item is capped at 400 KB, counting all attribute names and values together.
2. How many items can a single BatchWriteItem request contain?
BatchWriteItem accepts up to 25 put or delete requests per call, while BatchGetItem allows up to 100 items.
3. How much data does a single Query call return before pagination is required?
Query and Scan each return at most 1 MB per call; use LastEvaluatedKey to fetch further pages.
Flash Cards
Maximum DynamoDB item size? — 400 KB, including all attribute names and values combined.
Partition key vs sort key byte limits? — Partition key value up to 2048 bytes; sort key value up to 1024 bytes.
BatchGetItem vs BatchWriteItem item limits? — BatchGetItem: up to 100 items / 16 MB. BatchWriteItem: up to 25 items.
Query/Scan per-call data limit? — 1 MB per call; paginate with LastEvaluatedKey.
How to handle data larger than 400 KB? — Store the blob in S3 and keep only the object key and metadata in DynamoDB.