Active Record의 배치 처리 메서드인 find_each와 find_in_batches는 각각 다른 방식으로 대규모 데이터셋을 처리합니다.
find_each
find_each는 겉으로는 레코드를 하나씩 순회하는 것처럼 보이지만, 실제로는 내부적으로 지정된 batch_size (기본값 1000개)만큼 레코드를 배치로 가져와 처리합니다.
- 특징:
- 기본적으로 1,000개 단위로 레코드를 가져옵니다.
- 블록 내에서는 한 번에 하나의 레코드에 접근합니다.
- 각 개별 레코드에 동일한 작업을 수행할 때 매우 효율적입니다.
- 예시:
ruby User.find_each(batch_size: 1000) do |user| user.send_weekly_email end
find_in_batches
find_in_batches는 find_each와 달리, 각 배치를 레코드 배열 형태로 블록에 전달합니다. 이를 통해 그룹 단위로 레코드를 처리할 수 있습니다.
- 특징:
- 배치당 레코드의 전체 배열을 받습니다.
- 대량 삽입, CSV 내보내기, 그룹화된 분석 등 전체 그룹에 대한 작업을 수행할 때 이상적입니다.
- 예시:
ruby User.find_in_batches(batch_size: 1000) do |users| users.each { |user| user.send_weekly_email } end
사용 시기
find_each사용 시기:- 레코드를 개별적으로 처리할 때.
- 간결하고 깔끔한 코드를 선호할 때.
- 레코드당 메모리 효율성이 중요할 때.
find_in_batches사용 시기:- 전체 배치를 한 번에 처리해야 할 때.
- 그룹화된 로직(예: 데이터 요약)을 수행할 때.
- 데이터베이스 왕복 횟수를 줄여 성능을 최적화할 때.