Ada beberapa hal di sini. Pertama-tama, Anda tidak dapat mengikat daftar IN, setidaknya saya cukup yakin Anda tidak bisa. Saya menduga Hibernate menggunakan semacam trik yang Anda masukkan ke dalam daftar isi array statis yang dapat digunakan Oracle.
Kedua, jika kueri ini dijalankan dengan banyak parameter berbeda, Anda harus mengikat variabel atau kinerja seluruh database akan terganggu.
Konon, ada cara untuk mengikat daftar IN menggunakan 'trik' yang dijelaskan Tom Kyte di blognya -
http://tkyte.blogspot.com/2006/01/how -can-i.html
Kode di sana terlihat seperti:
[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
Bagian:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
Pada dasarnya di mana permintaan Anda pergi. Bit di atas adalah trik yang membagi string yang dipisahkan koma menjadi daftar nilai. Alih-alih mengikat daftar ke dalam tempat penampung :txt, Anda perlu mengonversi daftar menjadi string dan hanya mengikatnya.
Apakah Anda yakin perbedaan waktu kueri bukan karena caching atau variasi beban pada mesin? Mengurai kueri akan memakan waktu sedikit, tetapi beberapa detik adalah waktu yang lama.