피드로 돌아가기
Stop Guessing Between .count, .length, and .size in Rails
Dev.toDev.to
Backend

ActiveRecord 메서드 선택을 통한 DB Query 최적화 및 메모리 낭비 방지

Stop Guessing Between .count, .length, and .size in Rails

Pavel Myslik2026년 6월 18일3beginner

Context

Rails 개발 시 관습적으로 사용하는 .count, .length, .size 메서드의 내부 동작 차이로 인한 성능 저하 발생. 특히 메모리에 로드된 데이터를 무시하고 중복 쿼리를 실행하거나, 단순 수치 확인을 위해 대량의 레코드를 메모리에 적재하는 비효율적 구조가 병목 지점으로 작용.

Technical Solution

  • .count 호출 시 메모리 상태와 무관하게 항상 SQL COUNT(*) 쿼리를 실행하여 DB 최신 상태를 보장하는 구조
  • .length 사용 시 미로드 데이터의 전량 메모리 적재 후 Array 방식으로 카운트하여 대량 데이터 처리 시 Heap 메모리 압박 유발
  • .size 적용을 통해 로드 상태에 따라 COUNT(*) 쿼리와 인메모리 카운팅을 동적으로 전환하는 Adaptive 전략 채택
  • counter_cache 설정을 통한 DB 테이블 내 count 컬럼 직접 참조로 쿼리 실행 단계 자체를 제거하는 최적화 구현

- 최신 DB 값이 필수적인 경우에만 .count 사용 - 이미 메모리에 적재된 Collection의 크기 확인 시 .length 사용 - 일반적인 상황에서 가장 효율적인 기본값으로 .size 채택 - 잦은 카운트 조회가 발생하는 연관 관계에 counter_cache 도입 검토

원문 읽기