Il y a plusieurs choses ici. Tout d'abord, vous ne pouvez pas lier une liste IN, du moins je suis sûr que vous ne le pouvez pas. Je soupçonne qu'Hibernate utilise une sorte d'astuce pour placer le contenu de votre tableau dans une liste statique qu'Oracle peut utiliser.
Deuxièmement, si cette requête est exécutée avec de nombreux paramètres différents, vous devez lier des variables ou les performances de toute la base de données en souffriront.
Cela dit, il existe un moyen de lier une liste IN en utilisant une "astuce" décrite par Tom Kyte sur son blog -
http://tkyte.blogspot.com/2006/01/how -can-i.html
Le code qui s'y trouve ressemble à :
[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
La pièce :
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
Est essentiellement là où va votre requête. Le bit ci-dessus est l'astuce qui divise la chaîne séparée par des virgules en une liste de valeurs. Au lieu de lier une liste dans l'espace réservé :txt, vous devez convertir la liste en une chaîne et simplement la lier.
Êtes-vous sûr que la différence de temps de requête n'est pas due à des variations de mise en cache ou de charge sur la machine ? L'analyse de la requête prendra un peu de temps, mais plusieurs secondes, c'est long.