활성 레코드: 크기 대 개수
레일에서는 두 가지를 모두 사용하여 레코드 수를 확인할 수 있습니다.Model.size
그리고.Model.count
더 복잡한 쿼리를 처리하는 경우 다른 방법보다 한 가지 방법을 사용하는 것이 더 유리합니까?그것들은 어떻게 다릅니까?
예를 들어, 사진을 가진 사용자가 있습니다. 많은 가지고 있는지 보여주고 , 는 입니다.user.photos.size
보다 빠르거나 .user.photos.count
?
감사합니다!
당신은 그것을 읽어야 합니다, 그것은 여전히 유효합니다.
당신은 당신의 필요에 따라 당신이 사용하는 기능을 조정할 것입니다.
기본적으로:
이미 모든 항목을 로드한 경우 다음과 같이 말합니다.
User.all
그러면 당신은 사용해야 합니다.length
db db 쿼리를 사용합니다.로된것이사없용니다합으면드다니사▁if▁use합용▁loaded,를 사용합니다.
count
dbDB에.여러분이 사항들을 하고, 이한고사귀을찮하게고싶않요면, 용하세사다지러를 하세요.
size
은 적응할것입니다것다적니.
다른 답변에서 언급한 바와 같이:
count
는 SQL 을 수행합니다.COUNT
length
를 계산합니다.size
과도한 두 한 것을 .
하지만 한 가지 더 있습니다.우리는 한 사건을 발견했습니다.size
와다게행함동과 다르게 count
/length
다 같이, 그리고 그냥 지나칠 정도로 드물기 때문에 공유할까 생각했습니다.
를 사용하는 경우
:counter_cache
에서.has_many
회협.size
캐시된 개수를 직접 사용하고 추가 쿼리를 수행하지 않습니다.class Image < ActiveRecord::Base belongs_to :product, counter_cache: true end class Product < ActiveRecord::Base has_many :images end > product = Product.first # query, load product into memory > product.images.size # no query, reads the :images_count column > product.images.count # query, SQL COUNT > product.images.length # query, loads images into memory
이 동작은 레일 가이드에 설명되어 있지만, 처음에는 이 동작을 놓쳤거나 잊어버렸습니다.
tl;dr
- 데이터 사용이 필요하지 않다는 것을 알고 있는 경우
count
. - 해 본 적이 있는 경우 합니다.
length
. - 수 있는 에는 사처를모르속차수있경는우에는무할시용이가나거도▁if▁use는경에우rence▁diffe있▁is▁you▁is▁speed수사는▁the용▁it,able▁neglect▁don▁or▁used무를 사용합니다.
size
...
세어보세요
전송을 확인합니다.Select count(*)...
DB에 쿼리합니다.데이터가 필요하지 않고 카운트만 하면 되는 방법.
예: 새 메시지 수, 페이지만 표시될 때의 총 요소 수 등.
길이
필요한 데이터(예: 필요에 따라 쿼리)를 로드한 다음 카운트만 합니다.데이터를 사용하는 경우의 방법.
예:완전히 적재된 표, 표시된 데이터 제목 등의 요약
크기
데이터가 로드되었는지(즉, 레일에 이미 로드되어 있는지) 확인한 다음, 데이터를 카운트하기만 하면 됩니다. 그렇지 않으면 카운트를 호출합니다. (다른 항목에서 이미 언급한 함정도 포함됩니다.)
def size
loaded? ? @records.length : count(:all)
end
문제가 뭐죠?
올바른 순서대로 하지 않으면 DB를 두 번 칠 수 있습니다(예: 테이블의 요소 수를 렌더링된 테이블 위에 렌더링하면 DB로 전송되는 호출 수가 2개가 됩니다).
가끔씩size
"잘못된 것을 제거"하고 해시를 반환합니다.count
할 수 있음)
이 경우, 사용length
해시 대신 정수를 가져옵니다.
다음 전략은 모두 데이터베이스를 호출하여 다음을 수행합니다.COUNT(*)
질의하다
Model.count
Model.all.size
records = Model.all
records.count
다음은 데이터베이스의 모든 레코드를 Ruby로 로드하는 것만큼 효율적이지 않습니다. Ruby는 컬렉션의 크기를 계산합니다.
records = Model.all
records.size
모형에 연관성이 있고 소속 객체의 수를 찾으려는 경우(예:@customer.orders.size
), 데이터베이스 쿼리(디스크 읽기)를 방지할 수 있습니다.카운터 캐시를 사용하면 Rails는 캐시 값을 최신 상태로 유지하고 다음에 대한 응답으로 해당 값을 반환합니다.size
방법.
저는 사이즈 기능을 사용하는 것을 추천했습니다.
class Customer < ActiveRecord::Base
has_many :customer_activities
end
class CustomerActivity < ActiveRecord::Base
belongs_to :customer, counter_cache: true
end
이 두 가지 모델을 생각해 보십시오.고객은 많은 고객 활동을 하고 있습니다.
has_many 연결에서 :counter_cache를 사용하면 크기가 캐시된 개수를 직접 사용하고 추가 쿼리를 전혀 수행하지 않습니다.
한 가지 예를 들어 보겠습니다. 데이터베이스에서 한 고객이 20,000개의 고객 활동을 보유하고 있으며, 각 고객 활동의 레코드 수를 카운트, 길이 및 크기 방법으로 계산하려고 합니다.이 모든 방법의 벤치마크 보고서 아래에 있습니다.
user system total real
Count: 0.000000 0.000000 0.000000 ( 0.006105)
Size: 0.010000 0.000000 0.010000 ( 0.003797)
Length: 0.030000 0.000000 0.030000 ( 0.026481)
레코드 수를 계산하려면 :counter_cache Size를 사용하는 것이 가장 좋은 옵션이라는 것을 알게 되었습니다.
의사결정 프로세스를 단순화하기 위한 흐름도입니다.도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/6083219/activerecord-size-vs-count
'programing' 카테고리의 다른 글
SSL 인증서 확인 오류로 인해 번들 설치가 실패함 (0) | 2023.06.04 |
---|---|
Xcode 4.2 - '...' 선언은 이 기능 경고 이외에는 표시되지 않습니다. (0) | 2023.06.04 |
Postgre에서 테이블의 행 수를 빠르게 검색하는 방법SQL (0) | 2023.05.25 |
app.config에 의존하지 않고 SOAP 웹 서비스를 사용합니다. (0) | 2023.05.25 |
공백을 포함한 줄 길이별로 텍스트 파일 정렬 (0) | 2023.05.25 |