티스토리 뷰
N+1 Query Problem
예를 들어 Client 모델에 관계되어 있는 address 모델에서의 postcode를 뽑을 때 아래와 같은 코드를 사용하면,
clients = Client.limit(10)
clients.each do |client|
puts client.address.postcode
end
겉으로는 괜찮아 보이나 11번의 SQL 쿼리를 실행하는 안타까운 점이있다.
Client Load (0.1ms) SELECT * FROM "clients" LIMIT 10
Address Load (0.2ms) SELECT * FROM "address" WHERE "client_id" = 1
Address Load (0.2ms) SELECT * FROM "address" WHERE "client_id" = 2
...
Address Load (0.2ms) SELECT * FROM "address" WHERE "client_id" = 10
이 문제를 좀 더 효율적으로 변경하려면 Model 클래스의 includes 기능을 사용하면 2번의 쿼리로 해결할 수 있다.
clients = Client.includes(:address).limit(10)
clients.each do |client|
puts client.address.postcode
end
이 경우 단 2번의 쿼리만을 이용하여 해결한다.
SELECT * FROM "clients" LIMIT 10
SELECT * FROM "address" WHERE "address.client_id" IN (1,2,3,4,...,10)
참고 : http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
'Ruby&Rails > Rails' 카테고리의 다른 글
| [Rails] Routing에서 concern 을 이용한 중복 resources 관리 (0) | 2015.06.29 |
|---|---|
| [Rails] Ajax로 Create & Delete 기능 구현 (0) | 2015.06.26 |
| [Rails] Redirect and Flash 문법 (0) | 2015.06.24 |
| [Rails] validates 문법 (0) | 2015.06.24 |
| [Rails] CRUD의 Create & Update & Delete 문법 (0) | 2015.06.24 |
- Total
- Today
- Yesterday
- 주식투자
- 현대차
- 주가전망
- 알고리즘
- Java
- 투자전략
- 로봇관련주
- ruby
- 자료구조
- 이펙티브 자바
- 한국항공우주
- 엔비디아
- 방산주
- 개인투자자
- 지정학적리스크
- AI반도체
- 원달러환율
- 한화에어로스페이스
- 코스피
- 호르무즈해협
- 한미반도체
- SK하이닉스
- 반도체관련주
- 한화오션
- HBM
- 국제유가
- 삼성전자
- ruby on rails
- Rails
- 해운주
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |