2009-11-04 12 views

risposta

4

Questa limitazione del database esiste ancora con l'ibernazione. Se hai davvero bisogno di avere più di 1000 articoli nella tua clausola in devi dividere la lista tu stesso nel codice ed eseguire la query per ogni blocco di 1000 chiavi, quindi aggiungere insieme i set di risultati.

Nota questo hack si interrompe se la query deve ordinare o altrimenti aggregare i risultati della query perché il set completo di risultati sarà noto solo nel codice. In questo caso è meglio trovare un altro modo per scrivere la query che non richiede una clausola IN.

+1

Un modo alternativo sarebbe quello di incollare i valori 1000+ in una tabella temporanea globale nel database e unire le due tabelle. I database sono molto bravi a partecipare alla tabella :) –

+0

Esattamente lasciare che il database faccia il lavoro! La spaccatura è un lavoro ben noto ma che dovrebbe indicare che è necessario ripensare il tuo approccio. –

+0

Un'altra alternativa è fare O sui gruppi 1000 elementi IN. In questo modo puoi "ORDINARE PER" sul colloquio. – hidralisk

2

Sì, come Hibernate chiama Oracle a un certo punto in modo che il limite è il più basso dei limiti di Hibernate e Oracle

Hibernate non fa nulla di speciale con i dati per un in - appena lo passa al database

3

Abbiamo avuto lo stesso problema e risolto suddividendo in su in pacchetti 100er della clausola IN

select * from mytable where id in (...) or id in (...). 

Osservazione:

  • assicurarsi di utilizzare le variabili di binding
  • assicurati che la query abbia sempre lo stesso aspetto. Questo viene fatto riempiendo le clausole con -1 fino ad avere 100 elementi in esso
  • tenta di utilizzare sempre lo stesso numero di ORed in (...) in modo che la query guarda sempre allo stesso

Perché vuoi i punti sopra? È così che Query Optimizer può riutilizzare il piano di query.

ottimizzazione aggiuntive:

  • invece di usare -1, si può semplicemente utilizzare nuovamente l'ultimo valore true. Questo è anche un po 'meglio.

esempio: a (1, 2, 3, 4, 4, ..., 4)

noti inoltre: abbiamo testato con vari numeri fisso di elementi nella clausola e osservato diminuita prestazioni per molto più di 100 elementi.

+0

PS: se l'istruzione sql che restituisce i valori all'interno della clausola IN è nota, è possibile prendere in considerazione la possibilità di sostituire il proprio IN con un'istruzione EXISTS. –