programing

활성 레코드: 크기 대 개수

testmans 2023. 6. 4. 10:19
반응형

활성 레코드: 크기 대 개수

레일에서는 두 가지를 모두 사용하여 레코드 수를 확인할 수 있습니다.Model.size그리고.Model.count더 복잡한 쿼리를 처리하는 경우 다른 방법보다 한 가지 방법을 사용하는 것이 더 유리합니까?그것들은 어떻게 다릅니까?

예를 들어, 사진을 가진 사용자가 있습니다. 많은 가지고 있는지 보여주고 , 는 입니다.user.photos.size보다 빠르거나 .user.photos.count?

감사합니다!

당신은 그것을 읽어야 합니다, 그것은 여전히 유효합니다.

당신은 당신의 필요에 따라 당신이 사용하는 기능을 조정할 것입니다.

기본적으로:

  • 이미 모든 항목을 로드한 경우 다음과 같이 말합니다.User.all그러면 당신은 사용해야 합니다.length db db 쿼리를 사용합니다.

  • 로된것이사없용니다합으면드다니사▁if▁use합용▁loaded,를 사용합니다.countdbDB에.

  • 여러분이 사항들을 하고, 이한고사귀을찮하게고싶않요면, 용하세사다지러를 하세요.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

반응형