Je zde několik věcí. Za prvé, nemůžete svázat seznam IN, alespoň jsem si docela jistý, že nemůžete. Mám podezření, že Hibernate používá nějaký trik, který vkládáte obsah pole do statického seznamu, který může Oracle použít.
Za druhé, pokud je tento dotaz prováděn s mnoha různými parametry, musíte svázat proměnné, jinak utrpí výkon celé databáze.
To znamená, že existuje způsob, jak svázat seznam IN pomocí „triku“, který Tom Kyte popisuje na svém blogu –
http://tkyte.blogspot.com/2006/01/how -can-i.html
Kód v něm vypadá takto:
[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
Část:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
Je to v podstatě tam, kam váš dotaz směřuje. Bit výše je trik, který rozděluje řetězec oddělený čárkou na seznam hodnot. Namísto vazby seznamu na zástupný symbol :txt byste museli seznam převést na řetězec a ten pouze svázat.
Jste si jisti, že rozdíl v dobách dotazů není způsoben změnami mezipaměti nebo zatížením na počítači? Analýza dotazu bude chvíli trvat, ale několik sekund je dlouhá doba.