2011-10-24 1 views
0

그래서 다음 중 어느 것이 더 효율적인지 알고 싶습니다. 가장 좋은 대답은 실제로 나 자신을 위해 어떻게 미래에 알아낼 수 있을까요?레일 3에서 주문 쿼리의 효율성

두 쿼리는 다음과 같습니다

# id integer 
# created_at datetime 
# collection_id integer 
# updated_at datetime 
class Post < ActiveRecord::Base 
    belongs_to :collection 
end 

Post.where(:collection_id => collection_id).order(:updated_at).last 

그래서

Post.where(:collection_id => collection_id).order("updated_at DESC").first 

대, 2 부 질문 :

1) 그 문장 중 어느 것이 더 효율적입니다? (오타가없는 한 그들은 동등해야합니다.)

2) 어떻게이 질문에 대답 할 수 있었습니까?

색인이없는 것으로 가정합니다. 또한 쿼리의 collect_id 부분에 대한 결과 집합의 예상 크기에 따라 대답이 변경되는지 궁금합니다.

답변

2

적어도 Rails 3.1에서 두 쿼리 모두 실제로 데이터베이스에서 동일한 쿼리를 실행합니다. Rails는 쿼리에서 .last을 호출하면 순서를 뒤집어서 단일 요청으로 제한해야한다는 것을 알기에 충분히 똑똑합니다. 따라서 아래 줄은 실제로 검색어 끝에 ORDER BY updated_at DESC LIMIT 1을 추가합니다. 즉,이 줄은 이 아니며은 데이터베이스의 모든 레코드를 반환하고 각각에 대해 ActiveRecord 개체를 만들고 다음에을 반환하면 훨씬 효율적이지 않습니다.

Post.where(:collection_id => collection_id).order(:updated_at).last 
1

콘솔을 보면 (1) 실제로 실행되는 쿼리 (또는 쿼리)와 (2) 실행에 걸린 시간이 표시됩니다. 이것이 효율성을 추적하는 기본 방법입니다.

생산 중에는 쿼리를 실행하기위한 속도/시간에 대한 경고/분석을 제공하는 도구도 있습니다 (예 : NewRelic RPM). I 무료 버전은 효율성 분석을 수행하지만 응용 프로그램 런타임의 이전 30 분 동안 만 기록을 유지한다고 생각합니다.

일반적으로 (엄밀히 말하지만는 않음) 일반적으로 레일스와 DB 간의 라운드 트립 횟수가 적기 때문에 보내는 쿼리 수가 적을수록 부분적으로 더 좋습니다.

자유롭고 반복성이있는 무언가를 원하면 반복적으로 쿼리를 실행하고 각 실행마다 시간을 측정하고 쿼리/컨트롤러 동작이 사용자가 선택한 일부 벤치 마크보다 낮거나 여러 번 실행되는 평균 시간이 특정 임계 값 미만입니다.

이 방법은 앱에서 가장 자주 발생하는 작업에 대한 감시자로 활용할 수도 있으며 예상보다 오래 걸리는 경우 실패 할 수 있습니다. 이 테스트는 시뮬레이션 된 환경만을 커버 할 뿐이지 만, 중요한 동작이 예상 된 성능과 완전히 일치하지 않는지 여부를 나타내는 일반적인 지표로 사용할 수 있습니다.