반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 오라클
- HackerRank
- S3
- DB
- 율코딩
- 코딩
- 데이터분석
- dfs
- storage_integration
- 인덱스튜닝
- 백준
- 인덱스
- 조인
- 결합인덱스란
- snowflake
- 자료구조
- AWS
- Join
- Index
- 데이터베이스
- 쿼리
- dbeaber
- Oracle
- MySQL
- 결합인덱스조건
- 백트래킹
- 개발
- sql
- 문제풀이
- 알고리즘
Archives
- Today
- Total
율코딩
[Ruby On Rails] N+1 쿼리 해결 - Eager load , Preload, Include 본문
반응형
N+1 문제란?
연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다. 이를 N+1 문제라고 한다.
Eager Load
Left Outer Join을 의미한다.
Eager loading 을 이용하면 한 번의 쿼리문으로 모든 데이타를 추출 할 수 있으며 어플리케이션 성능 향상을 위해서 cache 기능을 적절히 이용하여 사용 할 수 있다.
User.eager_load(:workspaces).where(workspaces: {id: 3})
> SELECT `users`.`id` AS t0_r0, `users`.`provider` AS t0_r1, `users`.`uid` AS t0_r2, `users`.`encrypted_password` AS t0_r3, .........
생략
Preload
preload를 사용하면 총 두 개의 쿼리가 생성된다.
각 association 별로 데이터를 로드하기 위한 별도의 쿼리가 생성 되는 것이다.(association 당 하나의 쿼리).
association에 대한 필터를 적용하지 않고 메모리에 로드 되므로, association에서 where 및 find_by 같은 조건절을 쓸 수 없고 오류가 발생 한다.
그러나 부모 assocation 자체에서 사용할 수 있다.
User.preload(:workspaces)
> SELECT `users`.* FROM `users`
> SELECT `workspaces`.* FROM `workspaces` WHERE `workspaces`.`user_id` IN (2,3,5)
Include
Preload와 Eagerload 2가지 속성을 모두 가지고 있는 메소드이다.
기본 동작은 preload이지만, preload와는 달리 association에 where 절, order절을 적용하여 동작을 eager_load로 변경하거나, 이를 기본 동작으로 사용하려는 경우 reference를 사용할 수 있다.
반응형
Comments