2012-05-13 8 views
5

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?

+0

Puoi essere più chiaro: dai la query SQL generata ora e la variante che si tradurrebbe in prestazioni migliori. – gkamal

+0

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? –

+0

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

risposta

0

Se si desidera prestazioni elevate tra database diversi da quelle che consiglio di non utilizzare table-pr-class e molte o enormi query polimorfiche. Una colonna discriminatore di solito sarebbe meglio.

Si noti che è possibile combinare table-pr-class con colonne discrimantor se si dispone di più di due livelli nella gerarchia di classe.

+0

Grazie per la risposta. Tuttavia, sto cercando di evitare un enorme tavolo che il 99% delle volte il 90% dei suoi dati non è necessario suddividendo i tavoli. – user1392212

Problemi correlati