Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Consulta dinâmica com API HibernateCritera e Oracle - desempenho


Há algumas coisas aqui. Em primeiro lugar, você não pode vincular uma lista IN, pelo menos tenho certeza de que você não pode. Eu suspeito que o Hibernate está usando algum tipo de truque que você coloca o conteúdo do seu array em uma inlist estática que o Oracle pode usar.

Em segundo lugar, se esta consulta for executada com muitos parâmetros diferentes, você deve vincular variáveis ​​ou o desempenho de todo o banco de dados será prejudicado.

Dito isto, existe uma maneira de vincular uma lista IN usando um 'truque' que Tom Kyte descreve em seu blog -

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

O código lá se parece com:
[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

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

É basicamente onde sua consulta vai. O bit acima é o truque que divide a string separada por vírgulas em uma lista de valores. Em vez de vincular uma lista ao espaço reservado :txt, você precisaria converter a lista em uma string e apenas vincular isso.

Você tem certeza de que a diferença nos tempos de consulta não se deve ao armazenamento em cache ou às variações de carga na máquina? A análise da consulta levará um pouco de tempo, mas vários segundos é muito tempo.