sql >> Database >  >> RDS >> Oracle

Dynamische query met HibernateCritera API &Oracle - prestaties

Er zijn een paar dingen hier. Allereerst kun je een IN-lijst niet binden, ik ben er in ieder geval vrij zeker van dat je dat niet kunt. Ik vermoed dat Hibernate een truc gebruikt om je array-inhoud in een statische lijst te plaatsen die Oracle kan gebruiken.

Ten tweede, als deze query wordt uitgevoerd met veel verschillende parameters, moet u variabelen binden, anders zullen de prestaties van de hele database eronder lijden.

Dat gezegd hebbende, is er een manier om een ​​IN-lijst te binden met een 'truc' die Tom Kyte op zijn blog beschrijft -

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

De code daar ziet er als volgt uit:

[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

Het onderdeel:

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

Is eigenlijk waar uw vraag naartoe gaat. Het bovenstaande stukje is de truc die de door komma's gescheiden reeks opsplitst in een lijst met waarden. In plaats van een lijst te binden aan de tijdelijke aanduiding :txt, zou je de lijst naar een string moeten converteren en die gewoon binden.

Weet u zeker dat het verschil in querytijden niet te wijten is aan caching of laadvariaties op de machine? Het ontleden van de query duurt even, maar enkele seconden is lang.



  1. Verbindingsreeksparameters voor opgeslagen specificaties

  2. Entity Framework genereert short in plaats van int

  3. Bevestigingsfout bij:Django-rest-Framework

  4. FOUT:ORA-00917:ontbrekende komma bij gebruik van Hibernate met een bestaande reeks in oracle