Back to All Scenarios
PASSEDinfrastructure / graphql_n_plus_one_db_overload

GraphQL N+1 Query — Database Overload

A new GraphQL resolver deployed to production has an N+1 query problem. A single client query that fetches a list of 500 items triggers 501 database queries (1 for the list + 500 for related data). With 200 concurrent users making this query, the database is executing 100,000+ queries per second and grinding to a halt.

Pattern
SERVER_ERROR
Severity
CRITICAL
Confidence
95%
Remediation
Remote Hands

Test Results

MetricExpectedActualResult
Pattern RecognitionSERVER_ERRORSERVER_ERROR
Severity AssessmentCRITICALCRITICAL
Incident CorrelationYes18 linked
Cascade EscalationN/ANo
RemediationRemote Hands — Corax contacts on-site support via call, email, or API

Scenario Conditions

GraphQL API with new resolver. N+1 query on 'orders' resolver. Each list query of 500 items = 501 DB queries. 200 concurrent users. Database executing 100K+ queries/second. Normal: 2000 queries/second.

Injected Error Messages (2)

GraphQL API performance collapse — resolver 'Query.orders.items' executing 501 database queries per request (N+1 pattern detected), with 200 concurrent users generating 100,200 database queries per second, API latency increased from 200ms to 45 seconds, GraphQL query depth: 3, but each nested 'items' field triggering individual SELECT for each of 500 rows, DataLoader not implemented for 'items' resolver, query complexity score: 250,500 (limit should be 1000)
database connection pool exhausted — pg-prod receiving 100K+ queries/second (normal: 2000/sec), max connections 500/500 all active, connection queue depth: 4,700, database cpu at 100%, query latency: 8 seconds (normal: 5ms), most queries are simple SELECT by primary key from 'order_items' table but volume is overwhelming, deadlock detected between concurrent resolver queries, slow query log flooded with identical queries differing only by ID parameter

Neural Engine Root Cause Analysis

The GraphQL API is experiencing a classic N+1 query problem in the 'Query.orders.items' resolver, where each of 500 order items triggers individual database SELECT queries instead of batch loading. With 200 concurrent users, this generates 100,200 database queries per second, causing API latency to spike from 200ms to 45 seconds and effectively bringing down the service. The absence of DataLoader implementation and query complexity exceeding limits (250,500 vs 1000) indicates a fundamental application architecture issue rather than infrastructure failure.

Remediation Plan

1. Immediate: Implement query complexity limiting and rate limiting to prevent service collapse 2. Short-term: Implement DataLoader for the 'items' resolver to batch database queries 3. Add query depth limiting and timeout configurations 4. Optimize the database queries with proper indexing and JOIN operations 5. Add caching layer for frequently accessed order items 6. Implement monitoring for query complexity and database query counts 7. Load test the fixes before deploying to production
Tested: 2026-03-30Monitors: 2 | Incidents: 2Test ID: cmnckhkw909koobqek2mnu4q3