Há algumas coisas aqui. Em primeiro lugar, você não pode vincular uma lista IN, pelo menos tenho certeza de que você não pode. Eu suspeito que o Hibernate está usando algum tipo de truque que você coloca o conteúdo do seu array em uma inlist estática que o Oracle pode usar.
Em segundo lugar, se esta consulta for executada com muitos parâmetros diferentes, você deve vincular variáveis ou o desempenho de todo o banco de dados será prejudicado.
Dito isto, existe uma maneira de vincular uma lista IN usando um 'truque' que Tom Kyte descreve em seu blog -
http://tkyte.blogspot.com/2006/01/how -can-i.html
O código lá se parece com:
[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
A parte:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
É basicamente onde sua consulta vai. O bit acima é o truque que divide a string separada por vírgulas em uma lista de valores. Em vez de vincular uma lista ao espaço reservado :txt, você precisaria converter a lista em uma string e apenas vincular isso.
Você tem certeza de que a diferença nos tempos de consulta não se deve ao armazenamento em cache ou às variações de carga na máquina? A análise da consulta levará um pouco de tempo, mas vários segundos é muito tempo.