Oracle
 sql >> Base de données >  >> RDS >> Oracle

Requête dynamique avec HibernateCritera API &Oracle - performances

Il y a plusieurs choses ici. Tout d'abord, vous ne pouvez pas lier une liste IN, du moins je suis sûr que vous ne le pouvez pas. Je soupçonne qu'Hibernate utilise une sorte d'astuce pour placer le contenu de votre tableau dans une liste statique qu'Oracle peut utiliser.

Deuxièmement, si cette requête est exécutée avec de nombreux paramètres différents, vous devez lier des variables ou les performances de toute la base de données en souffriront.

Cela dit, il existe un moyen de lier une liste IN en utilisant une "astuce" décrite par Tom Kyte sur son blog -

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

Le code qui s'y trouve ressemble à :

[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 pièce :

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

Est essentiellement là où va votre requête. Le bit ci-dessus est l'astuce qui divise la chaîne séparée par des virgules en une liste de valeurs. Au lieu de lier une liste dans l'espace réservé :txt, vous devez convertir la liste en une chaîne et simplement la lier.

Êtes-vous sûr que la différence de temps de requête n'est pas due à des variations de mise en cache ou de charge sur la machine ? L'analyse de la requête prendra un peu de temps, mais plusieurs secondes, c'est long.