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?
Could pubblichi la tua definizione di '@ Subselect'? –
@Subselect è l'annotazione aggiunta su una classe/campo (infatti, è giustamente chiamata). Ma perché i filtri non si applicano alla query nidificata? – SnakePlissken
Ogni ottimizzatore decente dovrebbe spingere la condizione esterna nella tabella derivata, cioè riscrivere la seconda query al primo. Qual è il tuo DBMS? – dnoeth