Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Truy vấn động với HibernateCritera API &Oracle - hiệu suất

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo cá thể java.sql.blob trong thủ tục lưu trữ java

  2. Chiều dài thực của một chuỗi, như Oracle đã thấy

  3. Cách tạo null bằng null trong oracle

  4. Làm thế nào để tìm các phụ thuộc bên trong một gói oracle?

  5. Làm thế nào để một Oracle NUMBER có Quy mô lớn hơn Độ chính xác?