2012-07-12 2 views
5

을 최적화하는 방법은 세 가지 요소를 가지고있다. 현재 두 가지 옵션을 사용할 수 있습니다. 어느 것이 더 최적화되었는지는 알 수 없습니다. 옵션은 다음과 같습니다JPA 쿼리

1. 
select c from EntityC c where c.entityb in (select b from EntityB b where b.entitya = :entitya) 

2. 는

private Set<EntityC> entityCCol; 

@OneToMany(mappedBy="entityb") 
public Set<EntityC> getEntityCCol() 
{ 
    return entityCCol; 
} 

select b from EntityB a join fetch a.entityCCol b 

이 두 쿼리 쉽고 최적화 된 EntityB

에 새 속성을 추가 하시겠습니까?

+1

무엇 '에 대한 선택 엔터티 c c에서 c.entityB.entityA = :''? 이 쿼리를 만들고'entityB (entityA, id)에 인덱스 IX_B_A를 생성하면 결과 쿼리가 충분히 빠릅니다. –

답변

3

컬렉션의 크기에 따라 다릅니다. 소규모 컬렉션의 경우 개체 모델에서 관계를 사용합니다. 퍼포먼스보다 디자인/유용성 측면에서 볼 때 더 객체 지향적입니다. 나는 그것을 가져 오지 않겠지 만, 그냥 모델에 정상적으로 액세스하십시오. 모델을 더욱 유용하게 만들려면 A에서 B까지의 관계가 있어야합니다. # 1의 쿼리

, 당신의 쿼리가 하위 선택을 사용하여 매우 효율적이지, 그냥 EntityC의 C에서 조인

선택 C를 사용하는 경우 c.entityb.entitya = entitya

2

나는 모든 쿼리를 SQL 쿼리로 해석한다고 생각하는데, 이것들은 다른 스타일 일 뿐이라고 생각하지 않아도됩니다. 모든 쿼리는 theta 스타일로 해석됩니다. 나는 성능 차이가 있다고 생각하지 않는다. 그것은 단지 개인적인 선택 일 뿐이다. 여기에 SQL 쿼리 스타일 MySQL joins: ON vs. USING vs. Theta-style에 대한 매우 신선한 기사가 있습니다.이 링크가 어떻게 든 도움이되기를 바랍니다.

+0

위의 두 쿼리와 다른 제안 된 쿼리에 대한 내 관심은 성능입니다. 데이터베이스 EntityB에는 약 20,000 개의 레코드가 있고 20,000 개의 레코드 각각에는 EntityC라는 레코드가 200 개 이상 있습니다. –