Oracle conosce la limitazione a 1000 elementi nella clausola where a in (..)
. Questa limitazione esiste anche quando si usa Hibernate in combinazione con Oracle?oracle dove in limitazione a 1000/hibernate
risposta
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
.
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
sembra essere un bug in Hibernate:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1123
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.
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. –
- 1. Glorp e Oracle: limitazione del risultato della query
- 2. Limitazione dell'accesso a un plug-in .net
- 3. Oracle 10g - ottimizzazione DOVE NON È NULL
- 4. alternativa a listagg in Oracle?
- 5. valori Limitazione a costruttori di tipo
- 6. Dove sono archiviate le classi Java in Oracle?
- 7. Limitazione delle relazioni in Laravel
- 8. Migrazione EF a Oracle
- 9. If a select (ORACLE)
- 10. Limitazione valore F #
- 11. Limitazione di Mono Runtime
- 12. Limitazione dimensioni frame Webs
- 13. INFERIORE O UGUALE A in Oracle SQL
- 14. Dove scaricare Oracle 11g (11.2.0.4.0) client per windows server 2012
- 15. Limitazione operazione Netsuite
- 16. Limitazione modulo riproduzione 1
- 17. Limitazione FILESTREAM SQL Server
- 18. Larghezza tabella di limitazione
- 19. limitazione di PhoneGap: Build
- 20. limitazione cifra da virgola in C++
- 21. Limitazione dell'output da MoreLikeThis in Solr
- 22. Limitazione GWT StackPanel?
- 23. limitazione random.shuffle Python
- 24. Limitazione dei caratteri in un TextBox
- 25. migrazione da Oracle a SQL Server
- 26. Numero Oracle a C# decimale
- 27. Limitazione di un contenitore Docker a un singolo core CPU
- 28. SAS: variabili di limitazione in PROC EXPORT
- 29. limitazione di array_agg in Postgresql 9.1
- 30. Limitazione della larghezza di banda in Python
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 :) –
Esattamente lasciare che il database faccia il lavoro! La spaccatura è un lavoro ben noto ma che dovrebbe indicare che è necessario ripensare il tuo approccio. –
Un'altra alternativa è fare O sui gruppi 1000 elementi IN. In questo modo puoi "ORDINARE PER" sul colloquio. – hidralisk