ここにはいくつかのことがあります。まず第一に、INリストをバインドすることはできません。少なくとも、バインドできないと確信しています。 Hibernateは、配列の内容をOracleが使用できる静的なリストに入れる何らかのトリックを使用していると思われます。
次に、このクエリを多くの異なるパラメータで実行する場合は、変数をバインドする必要があります。そうしないと、データベース全体のパフォーマンスが低下します。
とはいえ、TomKyteがブログで説明している「トリック」を使用して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プレースホルダーにバインドする代わりに、リストを文字列に変換してバインドする必要があります。
クエリ時間の違いは、マシンのキャッシュや負荷の変動によるものではありませんか?クエリの解析には少し時間がかかりますが、数秒は長い時間です。