2011-07-17 2 views
3

ORM 때문에 N + 1 문제로 인해 응용 프로그램이 손상되었다는 것을 알고 나면 수행 할 수있는 개선 사항에 대한 자세한 정보와 N + 1 문제로 개선되기 전과 비교 된 시간.
그런 개선 전후의 시간차는 어떻게됩니까?
누구든지 문제를 분석하고 통계를 검색하는 일부 종이에 대한 링크를 제공 할 수 있습니까?레일스 : N + 1 문제 ... 통계 데이터 필요

답변

4

통계 데이터가 필요하지 않습니다. 단지 수학입니다. N + 1 (이상 1 + N)의 기록을 얻을 수

  • 1 쿼리를 의미하고,
  • N 쿼리는 모든 레코드는 더 큰 N은의이다

과 관련된 얻을 특히 쿼리가 네트워크를 통해 원격 데이터베이스로 전송되는 경우 성능이 저하됩니다. 그렇기 때문에 N + 1 문제가 계속 발생하여 DB에 데이터가 거의없는 개발 모드에서는 대개 중요하지 않지만 생산량이 수천 또는 수백만 행으로 늘어남에 따라 쿼리가 서버를 천천히 막습니다.

대신 모든 관련 기록

첫 번째 쿼리 것을 위해 (조인을 통해)

  • 단일 쿼리 또는
  • 2 쿼리 (주 레코드에 대해 하나 하나를 사용할 수 있습니다 (첫 번째 레코드의 데이터가 각 행에 복제 될 것입니다) 엄격하게 필요한 것보다 많은 데이터를 반환하지만 대개는 만드는 것이 좋습니다. 두 번째 쿼리는 모든 외래 키가 다음과 같이 전달되기 때문에 큰 데이터 세트에 대해서는 약간 번거로울 수 있습니다. 단일 범위이지만, 다시 일반적으로 가치있는 거래.

    실제 수치는 통계가 의미가있는 변수가 너무 많습니다. 번호 또는 레코드, DB 버전, 하드웨어 등

    레일즈로이 질문에 태그를 붙 였으므로 ActiveRecord는 N + 1 쿼리를 사용하는 것을 피하는 것이 좋습니다. eager loading에 대한 설명을 확인하십시오.

0

N + 1 문제로 인해 얼마나 많은 추가 선택이 수행되었는지에 따라 시차가 발생합니다. 여기에 N + 1에 대한 또 다른 stackoverflow question에게 주어진 대답에서 인용 한의 -

견적 즉

SELECT * FROM Cars; 

/* for each car */ 
SELECT * FROM Wheel WHERE CarId = ? 

를 시작, 당신은 N은이고, N 추가 선택 후 자동차에 대한 하나를 선택하고,이 총 차수.

는 시간 차이 위의 예에서

견적 종료가 많은 자동차 기록이 때마다 코드를 '휠'테이블을 조회하는 데 걸린 시간을 데이터베이스에 있던 방법에 따라 달라

/ORM은 새 레코드를 가져 . 자동차 기록이 2 개인 경우 N + 1 문제를 제거한 후 그 차이는 무시해도 좋을지 만, 자동차 기록이 100 만 개라면 큰 영향을 미칩니다.