Sto utilizzando il supporto di Hibernate per la strategia di ereditarietà TABLE_PER_CLASS. Funzionalità saggia funziona bene. Ogni volta che viene rilasciata interrogazione polimorfico Hibernate genera uno SQL contenente "UNION ALL" per i miei due classi concrete Un & B. Il generato SQL ha il seguente formato:Come superare i problemi di prestazioni causati dall'SQL generato della sottoclasse union in Hibernate
select C1, C2, C3 from (
select C1, C2, C3 from ClassA
union all
select C1, C2, C3 from ClassB
)
where
C1 == <value>
order by C2
limit 100
Il problema di questo approccio soffre davvero male le prestazioni sul DB lato. Tenendo conto della colonna C1 è una proprietà condivisa di ClassA e ClassB (derivata dal parent astratto) Hibernate potrebbe inserire la clausola where in entrambi i sub-select e migliorare drasticamente le prestazioni. Ad esempio,
select C1, C2, C3 from (
select C1, C2, C3 from ClassA where C1 == <value>
union all
select C1, C2, C3 from ClassB where C1 == <value>
)
order by C2
limit 100
Alcune ottimizzazioni potrebbero essere eseguite anche al limite. Sto usando l'API di criteri Hibernate nel mio livello DAO.
Interceptor, onPrepareStatment() non può essere utilizzato poiché gli argomenti non sono visibili. L'utilizzo di partizioni e possibilmente di altre opzioni sul DB è attualmente fuori dall'ambito in quanto vogliamo evitare l'ottimizzazione specifica del DB in questa fase del lavoro.
Qualche idea su come manipolare l'ibernazione per migliorare le prestazioni?
Puoi essere più chiaro: dai la query SQL generata ora e la variante che si tradurrebbe in prestazioni migliori. – gkamal
Qual è il database sottostante? Immagino che non sarebbe Oracle, dato che di solito spinge verso il basso i predicati in sottoselezioni e nei sindacati ... "C1" ha un indice appropriato in entrambe le tabelle? –
C1 hanno un indice su entrambe le tabelle. Potremmo finire per supportare più DB, tra cui Derby (Pure Java). Di conseguenza, l'obiettivo attuale è definire uno schema che produrrà le migliori prestazioni per tutti i database. – user1392212