2012-07-12 20 views
5

Mam trzy podmioty następująco:Jak zoptymalizować WZP Query

public class EntityA 
{ 
    private Long id; 
    //Getters and setters 
} 

public class EntityB 
{ 
    private Long id; 
    private EntityA entitya; 
    //Getters and setters 
} 

public class EntityC 
{ 
    private Long id; 
    private BigDecimal amount; 
    private EntityB entityb; 
    //Getters and setters 
} 

Teraz, biorąc pod uwagę instancji EntityA, chcę uzyskać listę EntityC. Mam obecnie dwie dostępne opcje. Nie wiem, który z nich jest bardziej zoptymalizowany. Dostępne są następujące opcje:

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

2. Dodaj nową właściwość do EntityB

private Set<EntityC> entityCCol; 

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

select b from EntityB a join fetch a.entityCCol b 

Która z tych dwóch zapytań jest łatwiejsza i zoptymalizowane?

+1

Co o 'wybierz c z EntityC c gdzie c.entityB.entityA =: a'? jeśli utworzysz to zapytanie i utworzysz indeks IX_B_A na jednostce B (entityA, id), wynikowe zapytanie będzie wystarczająco szybkie. –

Odpowiedz

3

To zależy od wielkości kolekcji. W przypadku małych kolekcji korzystałem z relacji w modelu obiektowym. Bardziej z perspektywy projektowania/użyteczności niż wydajności, jest bardziej zorientowany obiektowo. Nie chciałbym jednak dołączyć do niego, wystarczy normalnie uzyskać dostęp do modelu. Prawdopodobnie powinieneś także mieć związek od A do B, aby twój model był bardziej przydatny.

dla zapytania na # 1, zapytanie nie jest bardzo skuteczny przy użyciu podgrupy wybiera, wystarczy użyć sprzężenia,

wybierz C EntityC c = gdzie c.entityb.entitya: entitya

2

Myślę, że wszystkie zapytania zinterpretowane w zapytania SQL, to tylko różne style, nie trzeba o tym myśleć. wszystkie zapytania zostaną zinterpretowane w stylu theta. Nie sądzę, jest różnica w wydajności, to tylko osobisty wybór. tutaj jest bardzo świeży artykuł o stylu zapytań SQL MySQL joins: ON vs. USING vs. Theta-style, Mam nadzieję, że ten link ci jakoś pomoże.

+0

Moją obawą dotyczącą dwóch powyższych zapytań i wszelkich innych sugerowanych zapytań jest wydajność. Zgadnij, co w bazie danych EntityB ma około 20 000 rekordów, a każdy z 20 000 rekordów ma co najmniej 200 rekordów, tj. EntityC. –

Powiązane problemy