Oracle
 sql >> Database >  >> RDS >> Oracle

Query dinamica con HibernateCritera API e Oracle - prestazioni

Ci sono un paio di cose qui. Prima di tutto, non puoi associare una lista IN, almeno sono abbastanza sicuro che non puoi. Sospetto che Hibernate stia usando una sorta di trucco che metti i contenuti dell'array in un elenco statico che Oracle può utilizzare.

In secondo luogo, se questa query viene eseguita con molti parametri diversi, è necessario associare variabili o le prestazioni dell'intero database ne risentiranno.

Detto questo, c'è un modo per associare un elenco IN usando un "trucco" descritto da Tom Kyte sul suo blog -

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

Il codice lì dentro è simile a:

[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

La parte:

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

È fondamentalmente dove va la tua query. Il bit sopra è il trucco che divide la stringa separata da virgole in un elenco di valori. Invece di associare un elenco al segnaposto :txt, dovresti convertire l'elenco in una stringa e associarlo.

Sei sicuro che la differenza nei tempi di query non sia dovuta alla memorizzazione nella cache o alle variazioni di carico sulla macchina? L'analisi della query richiederà un po' di tempo, ma alcuni secondi sono molti.