Có một số điều ở đây. Trước hết, bạn không thể ràng buộc một danh sách IN, ít nhất tôi khá chắc chắn rằng bạn không thể. Tôi nghi ngờ Hibernate đang sử dụng một số loại thủ thuật mà bạn đưa nội dung mảng của mình vào một danh sách tĩnh mà Oracle có thể sử dụng.
Thứ hai, nếu truy vấn này được thực thi với nhiều tham số khác nhau, bạn phải ràng buộc các biến nếu không hiệu suất của toàn bộ cơ sở dữ liệu sẽ bị ảnh hưởng.
Điều đó nói rằng, có một cách để liên kết một danh sách IN bằng cách sử dụng một 'thủ thuật' mà Tom Kyte mô tả trên blog của mình -
http://tkyte.blogspot.com/2006/01/how -can-i.html
Mã trong đó trông giống như:
[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
Phần:
12 select *
13 from all_users
14 where user_id in (select * from bound_inlist);
Về cơ bản là nơi truy vấn của bạn. Bit ở trên là thủ thuật chia chuỗi được phân tách bằng dấu phẩy thành một danh sách các giá trị. Thay vì liên kết danh sách vào trình giữ chỗ:txt, bạn sẽ cần chuyển đổi danh sách thành một chuỗi và chỉ ràng buộc điều đó.
Bạn có chắc chắn sự khác biệt về thời gian truy vấn không phải do bộ nhớ đệm hoặc các biến thể tải trên máy? Phân tích cú pháp truy vấn sẽ mất một chút thời gian, nhưng vài giây là một thời gian dài.