Oracle
 sql >> база данни >  >> RDS >> Oracle

Динамична заявка с HibernateCritera API и Oracle - производителност

Тук има няколко неща. Първо, не можете да обвържете IN списък, поне съм почти сигурен, че не можете. Подозирам, че Hibernate използва някакъв трик, който поставя съдържанието на вашия масив в статичен вграден списък, който Oracle може да използва.

Второ, ако тази заявка се изпълни с много различни параметри, трябва да свържете променливи или производителността на цялата база данни ще пострада.

Въпреки това има начин да обвържете 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, ще трябва да преобразувате списъка в низ и просто да го обвържете.

Сигурни ли сте, че разликата във времето за заявка не се дължи на кеширане или вариации на натоварване на машината? Разборът на заявката ще отнеме малко време, но няколко секунди са много време.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hibernate Mapping - Свързване на две таблици с асоциативна таблица - Но с обрат

  2. Oracle:преобразувайте числа в думи на език, различен от английски

  3. Пример за APEX_ZIP

  4. Максималната дължина на VARCHAR е 4000, но може да се съхранява само 2666 байта дълъг тайландски текст

  5. Oracle SQL:Как да върнете няколко отделни колони