2015-08-12 11 views
5

Sto utilizzando l'ibernazione con le viste (annotazione @Subselect e @Synchronize) e filtri. Il problema è la query encapsulate in hibernate (definita dalla proprietà 'value' dell'annotazione @Subselect) e le prestazioni diventano molto lente.Come evitare la query nidificata in modalità ibernazione con viste e filtri

Per esempio, se scrivo la mia query SQL (che non prende più di 100 ms per eseguire) questo è così:

SELECT id, 
     country_id, 
     firstName, 
     lastName 
FROM client 
WHERE client.country_id IN (2564,2558,1452,3652) 

Ma se io usando Hibernate con i filtri, la query generata sarà :

SELECT _this.id   AS id1_0_0, 
     _this.country_id AS country_id2_0_0 
     _this.firstName AS firstName3_0_0, 
     _this.lastName AS lastName4_0_0 
FROM (
    SELECT id, 
      country_id, 
      firstName, 
      lastName 
    FROM client 
) _this 
WHERE _this.country_id2_0_0 IN (2564,2558,1452,3652) 

Ciò significa che il codice SQL generato da Hibernate è più lento rispetto al mio query SQL scritto a mano, perché tutte le righe della tabella 'cliente' (in Query nidificate) vengono caricati, e il funzionamento del filtro viene eseguita nella query genitore dopo aver caricato tutte le righe, questo è stupido e fornisce molto lento prestazioni (1,7 secondi contro meno di 100 ms). Quindi, qualcuno ha conosciuto un metodo per evitarlo?

+0

Could pubblichi la tua definizione di '@ Subselect'? –

+0

@Subselect è l'annotazione aggiunta su una classe/campo (infatti, è giustamente chiamata). Ma perché i filtri non si applicano alla query nidificata? – SnakePlissken

+4

Ogni ottimizzatore decente dovrebbe spingere la condizione esterna nella tabella derivata, cioè riscrivere la seconda query al primo. Qual è il tuo DBMS? – dnoeth

risposta

0

posso vedere i vari problemi e le soluzioni qui:

  1. un'occhiata se si può evitare di l'annotazione @Subselect affatto => se è possibile creare una vista nel database che restituisce i dati richiesti renderà molto più semplice l'intero scenario e le implicazioni (mappatura di ibernazione) (perché Hibernate dovrebbe fare o ottimizzare qualcosa, i database sono ottimizzati e progettati per)
  2. Hibernate non genera codice che è ovviamente ottimizzato per il database (versione) => prova a passare a una versione più recente di Hibernate oa influenzarla con suggerimenti/configurazione db specifici (dialetto, fornitore ecc.)
  3. il database non funziona correttamente nell'ottimizzazione della query (filtro premuto) e sembra molto scarso con una strategia di ottimizzazione così comune =>provare a passare a una versione db più recente o passare il DBMS se possibile (ad es. PostgreSQL, Oracle, ...), in quanto i problemi più futuri sono attese qui

(per i dettagli più specifici realmente bisogno di avere ulteriori informazioni di base sulle vostre tavole, la versione db e le classi annotate)