최대 절전 모드 페치 전략 - "조인"을 사용하는시기와 "선택"을 사용하는시기?

StackOverflow https://stackoverflow.com/questions/617145

  •  03-07-2019
  •  | 
  •  

문제

대부분의 최대 절전 모인 협회는 "Fetch"매개 변수를 지원합니다.

fetch="join|select"

"SELECT"가 기본값 인 것입니다.

어떤 연관성을 사용할 것인지 결정하는 방법은 무엇입니까?

나는 "Select"에서 "Applice Wide"로 변경하려고 시도했습니다. 생성 된 쿼리의 수는 아마도 10 배나 감소했지만 성능은 정확히 동일하게 유지되었습니다 (심지어는 조금 더 나빠집니다).

감사.

도움이 되었습니까?

해결책

Join은 N+1 문제를 해결해야합니다. 부모가 10 명인 경우 각각 자녀가 10 명인 경우 가입하려면 하나의 쿼리가 필요하며 Select는 11 명 (부모는 1 명, 부모의 자녀를위한 하나)이 필요합니다. 데이터베이스가 응용 프로그램과 동일한 서버에 있거나 네트워크가 실제로 빠르지 만 각 데이터베이스 호출에 대기 시간이 있으면 추가 할 수 있습니다. 결합 메소드는 모든 행에서 상위 열을 복제하기 때문에 초기 쿼리에서 약간 효율적이지만 데이터베이스에 하나의 왕복을 만듭니다.

일반적으로, 내가 모든 부모의 자녀가 필요하다는 것을 알고 있다면, 나는 가입합니다. 몇 명의 부모의 자녀 만 필요하면 선택을 사용합니다.

다른 팁

선택은 데이터베이스에 새 쿼리를 발행하여 하위 항목을 가져 오는 것입니다. 가입은 부모의 쿼리에 합류하여 자식 항목을 가져 오는 것입니다. 그래서 쿼리 수가 줄어든 경우에도 비슷한 성능을 보입니다.

고르다:

SELECT * FROM parent WHERE id=(whatever)
SELECT * FROM child WHERE id=(parent.child.id)

가입하다:

SELECT *
FROM parent
LEFT OUTER JOIN child ON parent.child.id=child.id
WHERE parent.id=(whatever)

다른 하나를 사용하는시기에 관해서는 ... 완전히 확실하지 않습니다. 데이터베이스 시스템에 따라 다를 수 있습니다. 하나가 항상 다른 것보다 낫다면, 나는 그들이 당신에게 선택권을주는 것을 귀찮게 할 것 같지 않습니다! 각각에 대해 비슷한 성능을보고 있다면 걱정하지 않을 것입니다.

부모가 자녀가 많고 그 자녀가 다른 많은 사람들이 있다면,이 경우 초기 '조인'이 네트워크를 질식시킬 수 있습니다. 내 제안은이 경우 'select'를 사용하여 selects를 분할하는 것입니다.

fetching = "가입"Fetching = "Join"을 수행하면 모든 정보를 단일 SELECT 문으로 검색합니다.

fetching = "select"이 경우보다 관련 컬렉션을 가져 오기 위해 두 번째 Select 문을 PaaS를 원한다면 Fetch = "Select"를 사용합니다.

원천 :최대 절전 모드 페치 전략

성능의 이유로 가입이 일반적으로 선호됩니다.

Select를 사용해야하는 한 가지 이유는 많은 관계가있는 결과 (오프셋 및 한계를 설정)를 페이징하는 경우입니다. 가입을 사용하는 경우, 루트 엔티티는 여러 개의 마니 어린이가 포함되어 있으면 여러 번 나타나고 "사본"은 한계에 대해 계산합니다 (동 최대 절전 모드가 Correst_root_entity를 사용한 사실 후에도 무너지는 경우에도).

사람들은 항상 사용을 사용하는 성능에 대해 이야기합니다 fetch = 가입. 그러나 내가 생각하는대로, 우리가 가져 오는 부모/자식 기록의 수를 이해하는 것이 중요합니다.

단일 부모 기록 만 가져오고 자녀가 많지 않다고 기대하면 사용하는 것이 좋습니다. fetch = 선택.

자녀를 포함한 모든 부모 기록을 가져 오려면 fetch = 가입

기록을 추가하기 위해, 기록이 게으르게 어린이를 가져 오는 경우 (게으른 = 참), 그러면 사용을 이해하지 못할 것입니다. fetch = 가입 모든 부모와 자식 기록이 한 번의 샷으로로드되므로.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top