2013-09-04 3 views
1

Ruby on Rails를 처음 사용했습니다. 이제 Rails 애플리케이션의 성능 문제에 대해 연구하고 있습니다. 나는 New Relic rpm을 사용하여 코드의 병목 현상을 발견했다. 이 일을하는 동안 나는 알아낼 수없는 것을 찾습니다. (A)의레일 애플리케이션에서 SQL 쿼리 작성

class B 
    include DataMapper::Resource 
    belongs_to :A, :key=>true 
    belongs_to :C, :key=>true 
end 

모델로이다 : (A)의 기본 키와 다음과 같은 C의 기본 키 : 문제는 그 두 가지 모델 모델 B는 두 가지 속성이 A, B 및 C를 사용하고 여기에 내 레일 응용 프로그램이다 다음 :

class A 
    include DataMapper::Resource 
    property :prop1 
    ... 
    has n, :bs 
    has n, :cs, :through => :bs 
end 

다음 문 a.find을 실행하는 동안 (: c.id => 10) 내부적으로는 다음과 같은 SQL 쿼리 실행 :

select a.prop1, a.prop2,... from a INNER JOIN b on a.id = b.a_id INNER JOIN c on b.c_id = c.id where (c.id=10) GROUP BY a.prop1, a.prop2,....[here in group by all the properties that has been mentioned in select appears, I don't know why] 

을 그리고이 사항이 너무 많이 걸리는 시각 웹 트랜잭션 중. 흥미로운 것은, 내가 터미널의 mysql 프롬프트에서 동일한 자동 생성 쿼리를 실행할 때 시간이 매우 적다는 점이다. 나는 group by 절에서 많은 분야를 언급했기 때문에 그런 것 같아. 쿼리가 어떻게 형성되는지 이해할 수 없습니다. 누구나 친절하게 도와 주시면 이것을 이해하고 최적화 해주세요. 정말 감사 할 것입니다. 고맙습니다.

class A < ActiveRecord 
    has_many :B 
    has_many :C, through: :B 
end 

class B < ActiveRecord 
    belongs_to :A 
    belongs_to :C 
end 

class C < ActiveRecord 
    has_many :B 
    has_many :A, through: :B 
end 

다음 당신은 단순히 호출 할 수 있습니다 :

a.c.find(10) #mind the plural forms though 

당신은 더 나은 성능이 방법을 얻을 것이다

답변

0

나는 당신에게 제대로 구성 모델 협회, 이런 식으로 뭔가를 가정합니다.

+0

DataMapper를 이미 사용하고 있습니다. ActiveRecord를 사용하여 다시 작성할 수 없으므로 너무 많은 작업이 필요합니다. DataMapper에 해결책이 있다면 제안하십시오. – Joy