sql >> Databasteknik >  >> RDS >> Oracle

Dynamisk fråga med HibernateCritera API &Oracle - prestanda

Det finns ett par saker här. Först och främst kan du inte binda en IN-lista, åtminstone är jag ganska säker på att du inte kan. Jag misstänker att Hibernate använder något slags trick som du lägger in ditt arrayinnehåll i en statisk inlist som Oracle kan använda.

För det andra, om den här frågan exekveras med många olika parametrar, måste du binda variabler, annars kommer prestanda för hela databasen att lida.

Som sagt, det finns ett sätt att binda en IN-lista med ett "trick" som Tom Kyte beskriver på sin blogg -

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

Koden där ser ut så här:

[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

Delen:

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

Det är i princip dit din fråga går. Biten ovan är tricket som delar upp den kommaseparerade strängen i en lista med värden. Istället för att binda en lista till platshållaren :txt, måste du konvertera listan till en sträng och bara binda den.

Är du säker på att skillnaden i frågetider inte beror på cachelagring eller laddningsvariationer på maskinen? Att analysera frågan kommer att ta lite tid, men flera sekunder är lång tid.



  1. Hur genererar man automatiskt identitet för en Oracle-databas genom Entity-ramverket?

  2. MySQL ordning efter fält i Eloquent

  3. Spring Boot Query-anteckning med nativeQuery fungerar inte i Postgresql

  4. rails - postgres-fel:Orsak:Inkompatibel biblioteksversion:libpq.5.dylib kräver version 1.0.0 eller senare,