2011-03-21 2 views
1

다음 방법을 최적화하는 데 도움이 필요합니다. 데이터베이스의 크기가 3K 사용자 및 100K 운동으로 커지면서 쿼리 비용이 너무 많이 들었습니다. 불행히도 내 SQL 기술은 초보적입니다.쿼리 축소 - 연결에 대한 조건?

이 메서드는 동일한 성별의 사람들이 다른 운동에 대해 주어진 운동의 순위와 해당 성별의 총 운동 횟수를 반환합니다.

Class Person 
    has_many :workouts 
    named_scope :men, :conditions => {:male => true} 
end 

Class Workout 
    belongs_to :person 
    named_scope :by, lambda {|person_id| {:conditions => {:person_id => person_id}}} 

    def rank_by_gender 
    people = Person.men.collect{|p| p.id} 
    { :place => 
     Workout.by(people).count(:conditions => ["time < ?", self.time]) + 1 
     :entries => 
     Workout.by(people).count() } 
    end 
end 
  • Person.men 지금 수천 개의 레코드를 반환 :이 샘플을 간단하게 제거 한 운동에 적용 가능한 다른 조건이있다. 해당 쿼리를 count 쿼리와 결합하는 방법이있을 수 있습니다. 예를 들어 male 특성과 함께 people 테이블에 대한 조인을 사용하면됩니까?

  • 계산 방법에 전달 된 조건에 사람 연결에 조건을 지정하는 방법이 있습니까?

  • 그 외에도 누구나이 방법으로 데이터베이스 쿼리의 크기와 시간을 줄이는 다른 방법을 알고 있습니까?

답변

1

이 당신을 위해 작동합니다 :

{ 
    :place => Workout.joins(:person).where(["`workouts`.time < ? AND `people`.male = ?", self.time, true]).size, 
    :entries => Workout.joins(:person).where(:people => {:male => true}).size 
    } 
+0

감사합니다. 내 애플 리케이션을 언급하는 걸 잊었 아직도 레일 2.2에 붙어 있지만 Workout.all (: 조인 => : 사람, : 조건 => [...]) 구문을 변경하기가 쉬웠다 –

+0

내가 필요한 모든 것이 있었기 때문에, 이게 제가 끝난 것입니다 : Workout.count (: joins => : person, : conditions => [...]) –

+0

쏴, 나는 그 끝까지. – mnelson

관련 문제