sql >> Base de Datos >  >> RDS >> Oracle

Consulta dinámica con HibernateCritera API y Oracle - rendimiento

Hay un par de cosas aquí. En primer lugar, no puede vincular una lista IN, al menos estoy bastante seguro de que no puede. Sospecho que Hibernate está usando algún tipo de truco:coloca el contenido de su matriz en una lista estática que Oracle puede usar.

En segundo lugar, si esta consulta se ejecuta con muchos parámetros diferentes, debe vincular variables o el rendimiento de toda la base de datos se verá afectado.

Dicho esto, hay una forma de enlazar una lista IN usando un "truco" que Tom Kyte describe en su blog:

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

El código allí se parece 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);

Es básicamente donde va tu consulta. El bit anterior es el truco que divide la cadena separada por comas en una lista de valores. En lugar de vincular una lista en el marcador de posición :txt, necesitaría convertir la lista en una cadena y simplemente vincularla.

¿Está seguro de que la diferencia en los tiempos de consulta no se debe al almacenamiento en caché o a las variaciones de carga en la máquina? Analizar la consulta llevará un poco de tiempo, pero varios segundos es mucho tiempo.