N+1 Problem
Car
객체 컬렉션(또는 db rows)가 있다고 가정하자, 각각의 Car
는 Wheel
객체를 갖공 있다. 즉, Car
과 Wheel
은 1-to-many 관계이다. 이때 모든 자동차들 정보를 쿼리한다고 가정해보자. naive 방법은 아래와 같을 것이다.
1
SELECT * FROM Cars;
그리고 각각의 Car에 대해서 다음의 쿼리를 실행한다.
1
SELECT * FROM Wheel WHERE CardId = ?
여기서 Cars에 대한 쿼리를 한번 실행하고, N개의 추가적인 쿼리를 실행하게 된다. 즉 N+1번의 쿼리를 실행하게 된다.
대안으로, 다음과 같이 쿼리를 실행할 수 있다.
1
SELECT * FROM Wheel
이는 db로의 round-trip의 수를 2회로 줄일 수 있게 된다. 대부분의 ORM tool들은 N+1 select를 방지하기 위한 몇가지 방법을 제공하고 있다.