Jest tu kilka rzeczy. Po pierwsze, nie możesz powiązać listy IN, przynajmniej jestem pewien, że nie. Podejrzewam, że Hibernate używa jakiejś sztuczki, którą umieszczasz zawartość tablicy w statycznej liście, z której może korzystać Oracle.
Po drugie, jeśli to zapytanie jest wykonywane z wieloma różnymi parametrami, musisz powiązać zmienne, w przeciwnym razie ucierpi wydajność całej bazy danych.
To powiedziawszy, istnieje sposób na powiązanie listy IN za pomocą „sztuczki”, którą Tom Kyte opisuje na swoim blogu -
http://tkyte.blogspot.com/2006/01/how -can-i.html
Kod tam wygląda tak:
[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
Część:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
To w zasadzie miejsce, do którego trafia Twoje zapytanie. Powyższy bit to sztuczka, która dzieli ciąg oddzielony przecinkami na listę wartości. Zamiast wiązać listę z symbolem zastępczym :txt, musisz przekonwertować listę na ciąg i po prostu ją powiązać.
Czy na pewno różnica w czasie wykonywania zapytań nie wynika z buforowania lub zmian obciążenia na komputerze? Parsowanie zapytania zajmie trochę czasu, ale kilka sekund to dużo czasu.