Ci sono un paio di cose qui. Prima di tutto, non puoi associare una lista IN, almeno sono abbastanza sicuro che non puoi. Sospetto che Hibernate stia usando una sorta di trucco che metti i contenuti dell'array in un elenco statico che Oracle può utilizzare.
In secondo luogo, se questa query viene eseguita con molti parametri diversi, è necessario associare variabili o le prestazioni dell'intero database ne risentiranno.
Detto questo, c'è un modo per associare un elenco IN usando un "trucco" descritto da Tom Kyte sul suo blog -
http://tkyte.blogspot.com/2006/01/how -can-i.html
Il codice lì dentro è simile a:
[email protected]> with bound_inlist
2 as
3 (
4 select
5 substr(txt,
6 instr (txt, ',', 1, level ) + 1,
7 instr (txt, ',', 1, level+1) - instr (txt, ',', 1, level) -1 )
8 as token
9 from (select ','||:txt||',' txt from dual)
10 connect by level <= length(:txt)-length(replace(:txt,',',''))+1
11 )
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
USERNAME USER_ID CREATED
------------------------------ ---------- ---------
SYSTEM 5 30-JUN-05
OPS$TKYTE 104 20-JAN-06
La parte:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
È fondamentalmente dove va la tua query. Il bit sopra è il trucco che divide la stringa separata da virgole in un elenco di valori. Invece di associare un elenco al segnaposto :txt, dovresti convertire l'elenco in una stringa e associarlo.
Sei sicuro che la differenza nei tempi di query non sia dovuta alla memorizzazione nella cache o alle variazioni di carico sulla macchina? L'analisi della query richiederà un po' di tempo, ma alcuni secondi sono molti.