Тук има няколко неща. Първо, не можете да обвържете IN списък, поне съм почти сигурен, че не можете. Подозирам, че Hibernate използва някакъв трик, който поставя съдържанието на вашия масив в статичен вграден списък, който Oracle може да използва.
Второ, ако тази заявка се изпълни с много различни параметри, трябва да свържете променливи или производителността на цялата база данни ще пострада.
Въпреки това има начин да обвържете IN списък с помощта на „трик“, който Том Кайт описва в своя блог -
http://tkyte.blogspot.com/2006/01/how -can-i.html
Кодът там изглежда така:
[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
Частта:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
Това е основно мястото, където отива вашето запитване. Горният бит е трикът, който разделя низа, разделен със запетая, на списък със стойности. Вместо да обвържете списък в контейнера :txt, ще трябва да преобразувате списъка в низ и просто да го обвържете.
Сигурни ли сте, че разликата във времето за заявка не се дължи на кеширане или вариации на натоварване на машината? Разборът на заявката ще отнеме малко време, но няколко секунди са много време.