Er zijn een paar dingen hier. Allereerst kun je een IN-lijst niet binden, ik ben er in ieder geval vrij zeker van dat je dat niet kunt. Ik vermoed dat Hibernate een truc gebruikt om je array-inhoud in een statische lijst te plaatsen die Oracle kan gebruiken.
Ten tweede, als deze query wordt uitgevoerd met veel verschillende parameters, moet u variabelen binden, anders zullen de prestaties van de hele database eronder lijden.
Dat gezegd hebbende, is er een manier om een IN-lijst te binden met een 'truc' die Tom Kyte op zijn blog beschrijft -
http://tkyte.blogspot.com/2006/01/how -can-i.html
De code daar ziet er als volgt uit:
[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
Het onderdeel:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
Is eigenlijk waar uw vraag naartoe gaat. Het bovenstaande stukje is de truc die de door komma's gescheiden reeks opsplitst in een lijst met waarden. In plaats van een lijst te binden aan de tijdelijke aanduiding :txt, zou je de lijst naar een string moeten converteren en die gewoon binden.
Weet u zeker dat het verschil in querytijden niet te wijten is aan caching of laadvariaties op de machine? Het ontleden van de query duurt even, maar enkele seconden is lang.