Field-level cost analysis in GraphQL - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When we ask about field-level cost analysis in GraphQL, we want to know how the time to get data grows as we ask for more fields.
We are trying to see which parts of the query take more time as the request gets bigger.
Analyze the time complexity of the following GraphQL query.
query GetUserData {
user(id: "123") {
id
name
posts {
title
comments {
text
}
}
}
}
This query fetches a user with their posts and comments on each post.
Look for parts that repeat work as data grows.
- Primary operation: Fetching posts and then fetching comments for each post.
- How many times: For each post, we fetch all its comments, so comments fetching repeats for every post.
As the number of posts and comments grows, the work increases.
| Input Size (posts) | Approx. Operations (comments per post = 5) |
|---|---|
| 10 | 10 posts + 10 * 5 comments = 60 |
| 100 | 100 posts + 100 * 5 comments = 600 |
| 1000 | 1000 posts + 1000 * 5 comments = 6000 |
Pattern observation: The total work grows roughly in a straight line with the number of posts and comments combined.
Time Complexity: O(p + p * c)
This means the time grows with the number of posts plus the number of comments for all posts.
[X] Wrong: "Fetching nested fields like comments doesn't add much time because it's just one query."
[OK] Correct: Each nested field can cause extra work for every item above it, so more nested fields multiply the work.
Understanding how nested fields affect query time helps you design efficient APIs and answer questions about scaling data fetching.
"What if we added another nested field under comments, like likes? How would the time complexity change?"
Practice
@cost directive in GraphQL field-level cost analysis?Solution
Step 1: Understand the purpose of field-level cost analysis
Field-level cost analysis helps monitor and limit resource use by assigning costs to fields.Step 2: Identify the role of the
The@costdirective@costdirective assigns a numeric complexity cost to each field to estimate query cost.Final Answer:
To assign a numeric cost to each field to track resource usage -> Option DQuick Check:
@costassigns cost = A [OK]
@cost tracks resource use per field [OK]- Confusing cost with data type definition
- Thinking
@costrenames fields - Assuming it sets default values
books?Solution
Step 1: Recall the correct directive syntax
The@costdirective uses parentheses with named arguments, e.g.,@cost(complexity: 5).Step 2: Check each option's syntax
books: [Book] @cost(complexity: 5)uses correct syntax with named argument and colon. The other three options use incorrect syntax forms.Final Answer:
books: [Book] @cost(complexity: 5) -> Option AQuick Check:
Correct directive syntax = B [OK]
- Using equal sign instead of colon
- Omitting parentheses
- Using braces instead of parentheses
type Query {
users: [User] @cost(complexity: 2, multipliers: ["first"])
}
input UserFilter {
first: Int
}
And the query:
{ users(first: 3) { id name } }What is the total cost of this query assuming
id and name fields have cost 1 each?Solution
Step 1: Calculate base complexity and multipliers
Base complexity is 2. The multiplier is the argument "first" with value 3, so multiply 2 * 3 = 6.Step 2: Add cost of requested fields
Fieldsidandnameeach cost 1, total 2. Add to 6 gives 8.Final Answer:
8 -> Option CQuick Check:
2 * 3 + 1 + 1 = 8 [OK]
- Ignoring multipliers
- Not adding field costs
- Multiplying fields cost instead of adding
type Query {
posts: [Post] @cost(complexity: "high")
}What is the main error here?
Solution
Step 1: Check the type of complexity argument
Thecomplexityargument expects an integer value, but "high" is a string.Step 2: Verify other parts of the directive usage
The field name and directive usage are valid; parentheses are present.Final Answer:
The complexity value must be an integer, not a string -> Option AQuick Check:
Complexity expects integer = D [OK]
- Using string instead of integer for complexity
- Thinking directive can't be on lists
- Missing parentheses in directive
comments with @cost(complexity: 1, multipliers: ["limit"]). The query requests comments(limit: 4) with subfields text and author, each costing 2. What is the total cost of this query?Solution
Step 1: Calculate base complexity with multiplier
Base complexity is 1. Multiplier is argument "limit" with value 4, so 1 * 4 = 4.Step 2: Add cost of subfields
Subfieldstextandauthoreach cost 2, total 4. Add to 4 gives 8.Step 3: Verify the total
Subfields are added flatly without further multiplication by list size: 4 (base) + 4 (subfields) = 8.Final Answer:
8 -> Option BQuick Check:
1*4 + (2+2) = 8 [OK]
- Multiplying subfields cost by multiplier (e.g., getting 20)
- Adding costs without multiplier
- Confusing which costs to multiply
