피드로 돌아가기
Dev.toBackend
원문 읽기
N+1 Query 해결을 위한 Rails Association 로딩 전략 최적화
includes vs joins vs preload vs eager_load in Rails
AI 요약
Context
Active Record Association 처리 시 발생하는 N+1 Query 문제로 인한 데이터베이스 부하 증가 상황. 데이터 조회 목적에 맞지 않는 로딩 전략 선택으로 인한 불필요한 메모리 점유 및 쿼리 실행 횟수 증가 발생.
Technical Solution
- 단순 필터링 및 정렬 목적의 최적화를 위해 메모리 로딩을 배제한 INNER JOIN 기반의 joins 활용
- 별도의 쿼리로 연관 데이터를 조회한 후 메모리에서 병합하는 preload 방식을 통한 쿼리 단순화
- LEFT OUTER JOIN을 강제하여 단일 쿼리로 데이터 조회와 필터링을 동시에 처리하는 eager_load 설계
- 조건절 포함 여부에 따라 preload와 eager_load 전략을 자동 선택하는 includes의 추상화 계층 활용
- 데이터 전송량 감소를 위해 조회 결과의 메모리 적재 여부를 결정하는 SQL 실행 계획 최적화
실천 포인트
- 데이터 표시가 목적이며 N+1 방지가 필요할 때: includes 사용 - 연관 테이블 기준으로 필터링만 수행하고 객체 로딩이 불필요할 때: joins 사용 - 필터링과 데이터 로딩을 단일 쿼리로 완결해야 할 때: eager_load 사용 - where/order 절에 연관 테이블 참조 시 includes가 eager_load로 전환되는지 확인