dynobase-icon
Dynobase

DynamoDB Limits: Item Size, API Limits and Quotas

Rafal Wilinski

Written by Rafal Wilinski

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's maximum item size is 400 KB, including attribute names and values. Query and Scan evaluate at most 1 MB per page, batch writes accept 25 operations, and transactions cover at most 100 distinct items and 4 MB. These fixed constraints are separate from adjustable defaults such as 20 GSIs per table and 40,000 read or write units per second per table or GSI.

The tables below cover items, keys, indexes, operations, throughput, control-plane requests, Streams, backups and vector search. Values are checked against the AWS service quotas and constraints documentation. DynamoDB uses binary size units: 1 KB is 1,024 bytes, so 400 KB is 409,600 bytes.

Fixed limits versus adjustable quotas

A fixed constraint requires a data-model or application change. AWS cannot raise the item-size limit or make a transaction contain more items. An adjustable quota is an account setting: check the applied value for the correct Region in Service Quotas before treating the published default as your ceiling.

In the tables, Service Quotas identifies quotas you can request there. AWS Support identifies increases or allowlisting routed through support. Fixed means design around the value. Where AWS publishes a default without documenting self-service adjustment, the table says so rather than promising an increase.

Items and attributes

ConstraintLimit or ruleAdjustable?
Maximum item or record size400 KB, including attribute names and valuesFixed
String and Binary attribute sizeMust fit within the item's 400 KB totalFixed
Attributes per itemNo separate count limit; the entire item must fitFixed size constraint
List, Map or Set elementsNo separate count limit; the entire item must fitFixed size constraint
Nested document depth32 levelsFixed
Number precision38 significant digitsFixed
Positive Number range1E-130 through 9.9999999999999999999999999999999999999E+125Fixed
Negative Number range-9.9999999999999999999999999999999999999E+125 through -1E-130; zero is also validFixed
General attribute name sizeAt least one character and less than 64 KB; use 65,535 bytes as the upper boundFixed
Key attribute names1 to 255 characters in the key-schema APIs; index key names must also fit 255 UTF-8 bytesFixed
User-specified projected attribute namesNonKeyAttributes accepts names up to 255 characters; keep names within 255 UTF-8 bytesFixed
Empty valuesEmpty Strings and Binary values allowed outside table/index keys; empty Lists and Maps allowedFixed rules
SetsNonempty, unique elements of one type: String, Number or Binary; no order guaranteeFixed rules
Item with local secondary indexesBase item plus its corresponding LSI entries must fit the documented 400 KB combined limitFixed

An empty set is invalid even though an empty list is valid. Empty String and Binary elements can appear inside sets, lists and maps. NULL is a supported attribute type; it is different from an absent attribute and cannot be a key.

How DynamoDB counts item size

Count the UTF-8 bytes of every attribute name, plus its value's stored representation. Multibyte characters can use more space than their character count suggests. Binary data is counted using its decoded length, although its base64 wire representation is larger. Numbers use DynamoDB's numeric representation, not simply the length of their JSON text.

Lists and maps add 3 bytes of container overhead and 1 byte per element, in addition to names and nested values. Booleans and nulls use 1 byte plus the attribute name. AWS's item-size calculation rules distinguish this item data from the additional storage overhead used for billing. Do not use the length of JSON.stringify(item) as an exact size validator.

Use the item size and capacity calculator when choosing how much data to keep together. Size also affects cost: writes round up in 1 KB units, and reads in 4 KB units. The 400 KB limit is a maximum, not a recommended item size.

Partition keys and sort keys

ConstraintLimit or ruleAdjustable?
String/Binary partition-key value1 to 2,048 bytesFixed
String/Binary sort-key value1 to 1,024 bytesFixed
Key attribute typesString, Number or Binary; no Map, List, Set, Boolean or Null keysFixed
Base-table primary keyOne partition-key attribute, with one optional sort-key attributeFixed
Multi-attribute GSI keysUp to 4 partition-key and 4 sort-key attributesFixed
Distinct partition-key valuesNo practical count limitNo count quota
Distinct sort-key values under a partition keyNo practical count limit, subject to item-collection constraints with LSIsNo count quota

The key-length limits concern values, not the length of attribute names. Number keys follow the Number range and precision rules. For multi-attribute GSIs, use the documented composite-key constraints rather than assuming the base-table key layout applies unchanged.

Table and index quotas

Resource or operationDefault or limitAdjustable?
Tables per account per Region2,500Service Quotas/account team; documented maximum 10,000 per account per Region
Total table size and item countNo practical limitNo size/count quota
Global secondary indexes per table20Service Quotas
Local secondary indexes per table5Fixed
Explicit INCLUDE attributes across all indexes100 total; the same name in two indexes counts twiceFixed
NonKeyAttributes per index projection20Fixed
LSI item collection10 GB for all base-table items and projected LSI entries sharing a partition-key valueFixed
Adding GSIs with UpdateTableOne new GSI per operationFixed operation constraint
Creating tables with secondary indexesSerialize creation; AWS documentation conflicts on concurrent indexed-table countsSee note below
Table and secondary-index names3 to 255 characters: letters, digits, underscore, hyphen or dotFixed
Table name uniquenessWithin an account and RegionFixed
Index name uniquenessWithin its base tableFixed

The 100-attribute projection quota does not apply to ALL or KEYS_ONLY. Automatic projection of table and index keys does not use the user-specified projection allowance. The separate per-index limit comes from the Projection API.

LSIs must be created with the table and cannot later be added or removed. GSIs can be added later, but a new index is not queryable until it becomes ACTIVE. Follow the online index creation rules, and serialize table creation where secondary indexes are included. The CreateTable introduction says only one indexed table can be in CREATING, while its error description mentions up to 250 concurrent indexed-table creations. Because those statements conflict, do not rely on either as an unconditional current quota.

Is DynamoDB limited to 10 GB?

No. The 10 GB item-collection limit applies to tables with LSIs, not to the whole table. It includes the base-table data and LSI projections for one partition-key value. Without LSIs, an item collection can be split across physical partitions. A partition key that accumulates an unbounded history is therefore a particular risk when you choose an LSI.

Data operations and request sizes

OperationLimitApplication behavior
GetItem, PutItem, UpdateItem, DeleteItemOne item per call; stored item maximum 400 KBAn update must also leave a valid-sized item
QueryUp to 1 MB evaluated per call, before filteringContinue with LastEvaluatedKey
ScanUp to 1 MB evaluated per call, before filteringContinue with LastEvaluatedKey
Parallel ScanTotalSegments from 1 to 1,000,000Keep each segment's continuation key with that segment
BatchGetItemUp to 100 items and 16 MB returned; may return partial results above 1 MB per partitionRetry UnprocessedKeys
BatchWriteItemUp to 25 puts/deletes and 16 MB request payloadRetry UnprocessedItems
TransactWriteItemsUp to 100 distinct items and 4 MB aggregate item dataAll actions succeed or fail together
TransactGetItemsUp to 100 distinct items and 4 MB aggregate item dataAtomic read, without index access
PartiQL ExecuteStatementStatement length up to 8,192 characters; reads evaluate up to 1 MB or Limit itemsFollow returned NextToken
PartiQL BatchExecuteStatementUp to 25 statementsAll reads or all writes; check individual errors
PartiQL ExecuteTransactionUp to 100 statements, within transaction item and size limitsReads or writes, not a mixed transaction

The BatchGetItem API can return a successful response with unprocessed keys. Likewise, BatchWriteItem can return unprocessed operations. Retry only those entries with exponential backoff and jitter. Batches are not transactions, and batch writes do not support updates or per-item conditions.

The wire payload can exceed stored item size because of DynamoDB JSON type wrappers and base64 encoding. A batch must satisfy both the item-level constraints and the total request limit.

A TransactWriteItems idempotency token remains valid for 10 minutes after the first request completes. Reusing it with different request parameters during that window fails; after the window, the request is treated as new.

Transactions cannot contain two actions on the same item, including a ConditionCheck plus an Update. Attach the condition to the update instead. They must stay within one account and Region. An MREC global table does not replicate a transaction atomically to other Regions, and MRSC global tables do not support transactions. See the transaction guide for patterns that preserve the required atomic boundary.

PartiQL is another API surface over the same database constraints. Its statement, batch and transaction limits do not make SQL-style joins or arbitrary cross-item updates available.

Expression limits

Expression componentLimitAdjustable?
Each expression string4 KBFixed
Single substitution token such as #name or :value255 bytesFixed
Combined ExpressionAttributeNames and ExpressionAttributeValues substitutions2 MBFixed
Operators/functions in an expression300Fixed
Operands in an IN comparison100Fixed
Document-path dereferences32Fixed

The 255-byte substitution-token limit does not mean every String value stored through an expression is limited to 255 bytes. Account for the combined substitution size separately.

The 300-operator limit applies to condition, filter and update expressions. Comparators, logical keywords, functions and arithmetic operators count. In SET price = price + :delta, the + counts; the assignment = does not. Reserved attribute names remain usable through ExpressionAttributeNames aliases.

Throughput and partition limits

ScopeProvisioned modeOn-demand modeAdjustable?
Physical partition3,000 read units/s and 1,000 write units/sSameFixed partition capability
Table or individual GSI40,000 RCU and 40,000 WCU40,000 RRU/s and 40,000 WRU/sService Quotas
Account, per Region80,000 RCU and 80,000 WCU across provisioned tables and GSIsNo account-level aggregate read/write quotaService Quotas for provisioned quotas
Minimum provisioned table/GSI capacity1 RCU and 1 WCUNot applicablePublished minimum
Provisioned table with Streams enabledDefault 40,000 WCU write quotaNot applicableService Quotas
Switch from provisioned to on-demandUp to 4 times per rolling 24 hoursDestination modeFixed switching rule
Switch from on-demand to provisionedDestination modeAt any timeSubject to table operation state
Provisioned decreasesUp to 27 per UTC day for each table/GSINot applicableService Quotas

Units are not interchangeable with request counts. A strongly consistent read of up to 4 KB uses one read unit, an eventually consistent read uses half, and a transactional read uses two. A write of up to 1 KB uses one write unit, or two for a transaction.

The decrease quota starts with four available decreases at the beginning of the UTC day. One replenishes each hour, with at most four available at once. This allows 27 decreases across a full day. Tables and GSIs have independent allowances, but an update decreasing both fails if either has exhausted its allowance.

An on-demand table can also have a user-configured maximum throughput target. That is separate from its service quota and warm throughput, which describes throughput it can handle immediately. Increasing a quota does not fix a hot key or automatically pre-warm a table. Inspect the resource ARN and ThrottlingReasons before changing capacity; the throttling guide explains each limit category.

Control-plane API quotas

These APIs create or describe resources. Their quotas are independent of item read/write capacity and generally apply per account per Region. The AWS constraints page does not mark every API rate as adjustable through Service Quotas, so do not assume a throughput quota increase raises them.

API or groupPublished rate or concurrency constraint
CreateTable, UpdateTable, DeleteTable, PutResourcePolicy, DeleteResourcePolicyDefault 500 combined operations in flight, adjustable through Service Quotas; separate operation-specific limits still apply
Mutable control-plane group above2,500 requests/s combined, with lower individual policy limits
DescribeTable, ListTables, GetResourcePolicy2,500 requests/s combined
PutResourcePolicy25 requests/s; wait 15 seconds after a successful policy update before another on that table
DeleteResourcePolicy50 requests/s; blocked for 15 seconds following a successful policy put on that table
GetResourcePolicy100 requests/s
Resource-policy document20 KB, including whitespace
DescribeLimitsCall at most once per minute to avoid throttling
DescribeStream10 requests/s
DescribeTableReplicaAutoScaling, UpdateTableReplicaAutoScaling10 requests/s each
DescribeContributorInsights, ListContributorInsights, UpdateContributorInsights5 requests/s each
DescribeTimeToLive10 read request units/s
UpdateTimeToLiveOne enable/disable request per table per hour
CreateBackup50 requests/s
DescribeBackup, DeleteBackup10 requests/s each
ListBackups5 requests/s
RestoreTableFromBackup, DescribeContinuousBackups10 requests/s each
Change ApproximateCreationDateTimePrecision with UpdateKinesisStreamingDestination3 times per 24 hours

A resource policy adds weight to mutable request accounting: two extra requests per KB of policy. For example, creating a table with a 5 KB policy counts as 11 requests. Deployment tooling should use bounded concurrency and backoff rather than retrying every resource at once. Backup API rates are documented in CreateBackup, DescribeBackup, DeleteBackup and ListBackups.

Streams, backups, PITR, TTL and bulk transfer

FeatureLimit or constraintAdjustment or alternative
DynamoDB Streams retention24 hoursFixed; archive events for longer retention
Streams GetRecordsUp to 1 MB or 1,000 records per call; shard iterator expires after 15 minutesFixed API constraints
Simultaneous Streams readersDesign for up to 2 per shard; 1 recommended for global tablesFan out downstream
Point-in-time recoveryConfigurable 1 to 35 days; default 35; restore to a new tableFixed recovery range
Latest PITR restore pointTypically about 5 minutes behind current timeTiming, not an immediate rollback guarantee
DynamoDB native restoresUp to 50 concurrent restores totaling 50 TBPublished quota
AWS Backup restoresUp to 50 concurrent restores totaling 25 TBSeparate AWS Backup quota
S3 import jobs50 concurrentPublished quota
Concurrent import source size15 TB in us-east-1, us-west-2 and eu-west-1; 1 TB elsewhereRegion-dependent quota
S3 objects per import50,000Published quota
Import destinationNew table only; no LSIsCannot import into an existing table with this service
Full exports300 concurrent tasks and 100 TB total in flightBoth quotas are checked
Incremental exports300 concurrent jobs and 100 TB total in flightBoth adjustable through Service Quotas
Incremental export window15 minutes to 24 hours, inside the PITR windowFixed window range
TTL attributeNumber containing Unix epoch secondsFixed format
TTL age and deletion timingValues more than 5 years in the past are ignored; eligible items are typically deleted within a few daysNo immediate deletion deadline

Exports require PITR and do not consume table read capacity. Imports do not consume write capacity. These operations have their own charges and concurrency quotas, so moving work away from the data plane does not make it quota-free.

TTL is asynchronous cleanup. Expired items can remain in reads and storage until deletion; filter them in the application when expiration affects correctness. The TTL guide includes the epoch conversion and setup details.

Global tables also have separate defaults: 400 MRSC global tables, 40,000 read/write units per second per table for either consistency mode, and 10 TB of new-replica backfill per destination Region per account per day. Coordinate increases across replica Regions through Service Quotas or AWS Support. A local table quota increase alone may not satisfy global-table replica creation requirements.

Vector index quotas

Native vector indexes are available on on-demand tables. Their limits are separate from GSI counts and ordinary read/write units. AWS lists the following in its service quotas page:

Vector index constraintDefault or maximumAdjustable?
Vector indexes per table5AWS Support
Dimensions per vector index4,096Fixed
TopK per SearchVectors request100Fixed
Partition-key attributes per vector index1Fixed
Search rate per partition-key value1 GB/sAWS Support
Index write rate per partition-key value10 MB/sAWS Support
Inline filters per vector index18Fixed
Base-table size for index creation without allowlisting600 GBAWS Support
Concurrent vector index creations/deletions per table1Fixed

The byte-throughput limits describe data processed, not a fixed number of search requests. Vector dimensions, projected data and the amount examined per search affect throughput. Do not interpret TopK=100 as allowing only 100 vectors in the index.

Workarounds for the limits people hit most

Items larger than 400 KB

Store large binary objects or documents in S3 and keep their object key, metadata and version in DynamoDB. Alternatively, split a document into separately addressable items, or compress a payload that does not need attribute-level querying. Leave space for keys and future attributes. Compression removes the ability to filter the compressed content directly, and splitting creates a multi-item consistency problem you must handle explicitly.

Query or Scan results larger than 1 MB

Keep requesting pages using the returned LastEvaluatedKey as ExclusiveStartKey. A filter runs after DynamoDB evaluates a page, so an empty Items array is not an end-of-results signal. Continue until there is no continuation key. The pagination guide covers the implementation.

An API Limit counts evaluated items, not matches after filtering. If most evaluated data is discarded, fix the key condition or index rather than issuing larger scans. DynamoDB does not provide SQL joins, arbitrary ordering or offset pagination; its query shape follows the key design.

Transactions larger than 100 items or 4 MB

First reduce the atomic unit: keep the small set of records that must change together in one transaction. Move large immutable payloads elsewhere. If a workflow must span several transactions, use explicit progress records, idempotency and compensating actions. Splitting a transaction into batches does not preserve all-or-nothing behavior.

Hot partitions despite spare table capacity

Find the hot key and determine whether reads or writes are throttling. Cache repeated reads when staleness is acceptable, distribute writes across a suitable key space, or shard a write-heavy aggregate and combine results on read. Adaptive capacity and splitting help distribute load, but a single hot item still has a partition's limits. An LSI also prevents splitting an item collection across partitions.

Frequently Asked Questions

What is the DynamoDB item size limit?

The maximum item size is 400 KB, or 409,600 bytes, including attribute names and values. Strings are counted as UTF-8 bytes and binary values by decoded size; the JSON text length is not an exact measurement.

Can I increase DynamoDB's maximum record size?

No. The 400 KB item limit is fixed. Store large payloads in S3, compress suitable data, or split the record into smaller items.

What is the maximum DynamoDB table size?

DynamoDB has no practical table-size or item-count limit. The 10 GB restriction applies to one item collection in a table with local secondary indexes, including its LSI projections.

Does a filter avoid the 1 MB query limit?

No. DynamoDB evaluates up to 1 MB before applying the filter. Continue with LastEvaluatedKey even if a filtered page returns no items.

How many attributes can a DynamoDB item have?

There is no separate attribute-count limit. All names, values and document overhead must fit within 400 KB, and nested documents cannot exceed 32 levels.

Which DynamoDB limitations can I increase?

Table counts, GSI counts and table/account throughput defaults are adjustable quotas. Item size, transaction boundaries, LSI count and expression constraints require application or data-model changes.

Dynobase is a Professional GUI Client for DynamoDB

Start your 7-day free trial today

Product Features

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