A feed of 20 posts, each with its author and 10 comments with their authors, is one GraphQL query and 241 DynamoDB requests when each relationship resolver fetches per parent. The arithmetic by page size and nesting depth, what it costs per million screen views, and four ways to cut it, from batching to a single Postgres join.
GraphQL resolves each field with its own resolver. For a relationship on a list, that resolver runs once per item unless it batches. With DynamoDB behind it there are no joins, so each run is its own request. One query from the browser becomes hundreds of database requests on the server.
Per-parent resolvers, no batching or caching.
Per-parent resolvers
Authors batched (BatchGetItem, 100 keys)
Postgres, one query with joins
DynamoDB requests for one feed screen, by number of posts shown (10 comments per post). Our arithmetic. Log scale.
AppSync bills $4.00 per million queries and mutations. DynamoDB bills the requests behind them: with small items, each of the 241 requests reads half a request unit at most, about 120 units per screen, or $15 per million screen views at $0.125 per million reads. Together, about $19 per million views of one screen. That is rarely the bill that hurts. The latency of three sequential rounds of requests, and throttling when the comment-author fan-out hits one popular user's partition, are.
Ask for less: a selection set without comment authors removes 200 of the 241 requests. The cheapest fix is often in the client.
Denormalize what every screen shows: store the author's name and avatar on the comment, and update it when a profile changes.
Batch: a Lambda resolver with batching collects the 200 author lookups into two BatchGetItem calls.
Move relational data to Postgres: one query with two joins returns the whole screen, and the GraphQL or REST layer above it stays.
We'll read your schema and traces with you and tell you which of the four fixes pays off first. Free, 30 minutes.
Once a month: what changed in tech that month and what it means for you, from cloud and AI to security and the tools you build with. Every item links to its source. No sales pitch, unsubscribe in one click.
Book a free 30-minute call about it. Bring your setup and your bill; you'll leave knowing what we'd do first and roughly what it costs, whether or not you hire us.
Or keep reading
What an Amplify Gen 2 App Actually Deploys, and the Same App Without Amplify
Behind a few TypeScript files, an Amplify Gen 2 backend is Cognito, AppSync, a DynamoDB table per model, Lambda functions, S3 and nested CloudFormation stacks. Two diagrams: what Amplify creates, and the same app built directly, with a table of each piece, what replaces it, and how hard the move is.
Read
The AppSync Limits That Push Teams Off It: 30 Seconds, a JavaScript Subset, and 240 KB Subscriptions
Most AppSync quotas are generous. The ones that hurt are fixed: a 30-second request ceiling, resolvers in a JavaScript runtime with no try/catch, no async and no network access, 32 KB of resolver code, ten functions per pipeline and 240 KB subscription messages. What each means in practice and the usual workaround.
Read
As of November 4, 2026. Provided as is, for general information, and accurate to the best of our knowledge on the date shown. Not legal, compliance, tax, financial or other professional advice. Prices, limits and vendor services change; check current vendor documentation before relying on anything here. Terms of use.