Det finns ett par saker här. Först och främst kan du inte binda en IN-lista, åtminstone är jag ganska säker på att du inte kan. Jag misstänker att Hibernate använder något slags trick som du lägger in ditt arrayinnehåll i en statisk inlist som Oracle kan använda.
För det andra, om den här frågan exekveras med många olika parametrar, måste du binda variabler, annars kommer prestanda för hela databasen att lida.
Som sagt, det finns ett sätt att binda en IN-lista med ett "trick" som Tom Kyte beskriver på sin blogg -
http://tkyte.blogspot.com/2006/01/how -can-i.html
Koden där ser ut så här:
[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
Delen:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
Det är i princip dit din fråga går. Biten ovan är tricket som delar upp den kommaseparerade strängen i en lista med värden. Istället för att binda en lista till platshållaren :txt, måste du konvertera listan till en sträng och bara binda den.
Är du säker på att skillnaden i frågetider inte beror på cachelagring eller laddningsvariationer på maskinen? Att analysera frågan kommer att ta lite tid, men flera sekunder är lång tid.