What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

An N+1 query problem occurs when an application fetches a collection of records, then issues another database query for a related record each time it processes a parent. The repeated round trips can make a list page, API endpoint, or serializer slow as its result set grows—even when each individual query looks harmless. The fix is to identify the relationship the request actually uses and load it deliberately, then measure the result.

What the N+1 query problem means

Suppose a page fetches a list of posts. That initial query is the “1.” If rendering each post separately loads its author, the application may then issue N more queries—one for each of N posts. The total is often described as 1 + N.

This is a pattern, not a guaranteed query count or a measure of performance. Caching, identity-map reuse, batching, conditional access, and nested relationships can change what you observe. The underlying issue is that application code triggers relationship loads repeatedly, often through lazy access inside a loop. SQLAlchemy describes this behavior and identifies eager loading as the usual mitigation in its Relationship Loading Techniques guide.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The access that triggers a query can look like ordinary property use: a template reads post.author, a serializer reads a related field, or a service method accesses a collection. The database work is hidden behind that access, so the code may not look like it is issuing queries.

#1 Best Overall
Dell PowerEdge R730xd Server 24B SFF 2U, 2X Intel Xeon E5-2690 v4 2.6Ghz (28-cores Total), 128GB DDR4 RAM, 4X 1.2TB 10K SAS 2.5” 12Gb/s HDD, H730P 2GB RAID, NIC 10Gb + I350 1Gb (Renewed)
  • Dell PowerEdge R730xd 24B SFF 2U Server
  • 2x Intel Xeon E5-2690 v4 2.6Ghz 14-Core (28-cores Total)
  • 128GB DDR4 RAM – 4x 1.2TB 10K SAS 2.5” 12Gb/s
  • Dell H730P mini 2GB 12Gb/s RAID
  • 2x 750W PSU - 2x 10Gb SFP+ 2x 1Gb (RJ45) NIC

How to tell whether an endpoint has N+1 queries

A slow endpoint alone does not prove an N+1 problem. Capture the SQL issued during a representative request and look for the pattern: repeated SELECT statements with the same structure but different foreign-key values. Then check whether the repetitions grow as the number of parent records grows.

  1. Reproduce the request at realistic scale. Use a representative number of parent records, not just one or two.
  2. Capture the request’s SQL. Use ORM query logging, database logs, or request traces that show individual statements.
  3. Look for repeated query shapes. A likely N+1 has many similar SELECTs that differ mainly in the key used to fetch a related row.
  4. Find the access that triggers them. Check loops, templates, serializers, API resolvers, and service methods for relationship access.
  5. Separate other causes. One costly query, a missing index, a lock wait, or application CPU work calls for a different diagnosis.

ORM-aware tools can help identify likely lazy loads. The nplusone project documents support for Django and SQLAlchemy and says the tool is intended for development use, not production deployment. Treat its alerts as diagnostic clues and confirm them in the SQL emitted by your own request.

Query plans answer a different question from request traces. PostgreSQL’s EXPLAIN documentation explains how to inspect a query plan; a plan helps analyze a statement’s execution, but does not by itself show how many separate statements the application issued.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Dell Optiplex 7050 SFF Desktop PC Intel i7-7700 4-Cores 3.60GHz 32GB DDR4 1TB SSD WiFi BT HDMI Duel Monitor Support Windows 11 Pro Excellent Condition(Renewed)
  • Model: Dell OptiPlex 7050 Small Form Factor (SFF)
  • Processor: Intel Core i7-7700 3.60 GHz
  • Memory: 32GB DDR4 Ram
  • Storage: 1TB Solid State Drive (SSD) Fast Boot + Storage
  • Operating System: Windows 11 Pro (64-bit)

Choose a loading strategy that fits the relationship

The aim is to batch the related data the request uses—not to load every possible relationship or minimize the statement count at any cost. A join can reduce round trips but repeat parent columns across result rows; a batch query avoids that particular multiplication but adds a statement. The best choice depends on relationship cardinality, data volume, backend support, and the request’s actual access pattern.

Strategy How it works Often fits Trade-offs
Lazy loading Fetches the relationship when code accesses it, potentially once per parent. A related value that is rarely accessed, or a small number of records. Can create repeated round trips when relationship access happens for many parents.
Join-based eager loading Loads related fields through a SQL join as part of the main query. Single-valued references, such as a many-to-one or one-to-one relationship. Can return repeated parent columns for multi-valued relationships and make queries more complex.
Batch or select-in loading Fetches related rows in a separate query for a group of parent keys. Collections and other relationships where joining would multiply parent rows. Still uses additional statements; large key lists or backend constraints can matter.

A batch strategy often turns one query per parent into a small number of queries per relationship or batch. It does not guarantee exactly two statements in every case: nested relationships, batching limits, and ORM behavior affect the count.

Applying eager loading in SQLAlchemy

SQLAlchemy’s 2.1 relationship-loading guide says, “In most cases, selectin loading is the most simple and efficient way to eagerly load collections of objects.” For collections, select-in loading fetches associated rows in a separate SELECT using parent keys in an IN clause, avoiding multiplication of parent rows from a join.

Rank #3
Hewlett Packard Enterprise ProLiant MicroServer Gen11 Tower Server with Intel Xeon 6315P, 16GB DDR5, 4LFF Bays, 180W PSU (P86811-005)
  • 2.80 GHz processor speed ensures efficient operation with consistent reliability
  • Intel Xeon 2.80 GHz processor provides enterprise-grade performance with built-in security and remote management capabilities
  • Quad-core (4 Core) processor core helps server process data quickly and reliably for maximum productivity
  • 1 processors supported for faster processing and improved access to data, optimizing performance under heavy loads
  • With 16 GB memory, you can multitask between applications seamlessly, keeping productivity high and response times quick

Joined eager loading can be suitable for scalar references and some collection workloads. SQLAlchemy describes joinedload as a loading strategy intended to change how related data is fetched without changing the logical query results. Compare the row shape and total work for your actual request rather than assuming that fewer statements will be faster.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

There is a documented limitation for select-in loading with composite primary keys on backends that lack tuple-IN support, including SQL Server. Check the SQLAlchemy guide and your database’s capabilities when that combination applies.

SQLAlchemy also provides raiseload to raise an informative error when code accesses a relationship that was not explicitly loaded. It can expose surprise lazy loads during development. The guide notes that raiseload directives do not prevent loads required internally during a unit-of-work flush.

Rank #4
HPE Hewlett Packard Enterprise ProLiant MicroServer Gen11 Tower Server, Intel Pentium Gold G7400 Processor, 16GB Memory, 1TB HDD Storage, External 180W US Power Supply Smart Choice P74439-005
  • MODEL P74439-005: Compact and affordable HPE ProLiant MicroServer Gen11 powered by Intel Pentium Gold G7400 3.7GHz processor, ideal for file sharing, NAS, and basic business workloads
  • READY OUT OF THE BOX: Includes 16GB DDR5 UDIMM memory (expandable to 128GB), one 1TB SATA 6G Business Critical HDD, embedded Intel VROC SATA, dedicated iLO-M.2 port kit, 180w external power adapter and 1/1/1 warranty for dependable plug-and-play server operation
  • WHISPER-QUIET & SPACE-SAVING: Ultra-compact mini tower design fits easily in small office spaces; supports wall, flat, or vertical placement for deployment flexibility
  • INTEGRATED REMOTE MANAGEMENT: Comes with HPE iLO 6 and embedded TPM 2.0 for secure, license-free remote server administration through shared port access
  • EXPANDABLE DESIGN: Two PCIe slots (including PCIe 5.0) and four LFF-NHP drive bays provide robust options for storage and component scalability. Features new MR408i-p controller support for enhanced storage performance

Applying eager loading in Django

Django distinguishes loading techniques by relationship shape. select_related uses SQL joins for single-valued foreign-key and one-to-one relationships. prefetch_related retrieves related objects in an additional batch query, including for multi-valued relationships. Django’s QuerySet reference documents both approaches.

Be selective: loading every reachable relationship can return more data and create a more complex query than the request needs. Prefetching a very large set can also create a large IN clause that causes database parsing or execution problems. In Django 6.1, calling select_related() without arguments is deprecated and scheduled for removal in Django 7.0; check the documentation for the version used by your project.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Other ORM strategies and version caveats

Hibernate’s version 5.0 fetching guide distinguishes SELECT fetching, which can create an N+1 pattern, from JOIN fetching and BATCH fetching with an IN restriction. The cited guide is for an older version, so verify API syntax and defaults against the Hibernate version in your project before applying its examples.

Best Value
HP Z4 G4 Workstation, Intel Xeon W-2133 (6-Core) up to 3.9GHz, 64GB DDR4, 512GB NVMe M.2 SSD + 2TB HDD, Nvidia Quadro P400 2GB, USB 3.1, Windows 11 Pro (Renewed)
  • HP Z4 G4 Workstation Tower
  • Intel Xeon W-2133 6-Core 3.6GHz (3.9GHz Turbo)
  • 64GB DDR4 Memory - Nvidia Quadro P400 2GB
  • 512GB NVMe M.2 SSD (boot) + 2TB HDD (storage)
  • Windows 11 Pro 64-bit

Rails developers can consult the official Active Record Query Interface guide for query and association behavior. Choose a mitigation based on the Rails version and the relationship involved.

Verify that the fix helped

  1. Repeat the same representative request. Keep the endpoint and data scale comparable to the baseline.
  2. Inspect emitted statements again. Confirm that relationship queries no longer grow one-for-one with parent records.
  3. Measure the request, not just its query count. Compare latency and resource use under realistic conditions; fewer SQL statements do not automatically mean less total work.
  4. Inspect expensive statements where needed. Use query plans to investigate database execution, alongside request traces for the number of application-issued statements.

There is no universal query-count threshold or slowdown percentage that identifies every N+1 problem. The useful evidence is a repeated relationship query pattern that scales with the request’s parent records, followed by a measured improvement after changing how that relationship is loaded.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.