sql >> Databáze >  >> RDS >> Oracle

Dynamický dotaz s HibernateCritera API &Oracle - výkon

Je zde několik věcí. Za prvé, nemůžete svázat seznam IN, alespoň jsem si docela jistý, že nemůžete. Mám podezření, že Hibernate používá nějaký trik, který vkládáte obsah pole do statického seznamu, který může Oracle použít.

Za druhé, pokud je tento dotaz prováděn s mnoha různými parametry, musíte svázat proměnné, jinak utrpí výkon celé databáze.

To znamená, že existuje způsob, jak svázat seznam IN pomocí „triku“, který Tom Kyte popisuje na svém blogu –

http://tkyte.blogspot.com/2006/01/how -can-i.html

Kód v něm vypadá takto:

[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

Část:

12  select *
13    from all_users
14   where user_id in (select * from bound_inlist);

Je to v podstatě tam, kam váš dotaz směřuje. Bit výše je trik, který rozděluje řetězec oddělený čárkou na seznam hodnot. Namísto vazby seznamu na zástupný symbol :txt byste museli seznam převést na řetězec a ten pouze svázat.

Jste si jisti, že rozdíl v dobách dotazů není způsoben změnami mezipaměti nebo zatížením na počítači? Analýza dotazu bude chvíli trvat, ale několik sekund je dlouhá doba.



  1. Jak přejít na nižší verzi/mít předchozí verzi Postgres DB v Postgres.app

  2. Sloupec bajtů Postgres vrací řetězec (pole znaků) namísto bajtového pole

  3. Výkon dílčího dotazu v klauzuli IN s velkými tabulkami v odstraňovacím dotazu

  4. Nahraďte všechna pole v MySQL