티스토리 뷰
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
- install
- 이펙티브 자바
- 반도체관련주
- 현대차
- Message Queue
- CSS
- 투자전략
- codecademy
- javascript
- html
- 한미반도체
- 삼성전자
- 자료구조
- 프로그래밍
- Rails
- 엔비디아
- 알고리즘
- ruby on rails
- HBM
- SK하이닉스
- 웹프로그래밍
- ubuntu
- 주식투자
- Java
- 국제유가
- ruby
- 티스토리 초대장
- 이수페타시스
- OpenStack
- rabbitmq
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
