sql >> Database teknologi >  >> RDS >> Oracle

Dynamisk forespørgsel med HibernateCritera API &Oracle - ydeevne

Der er et par ting her. Først og fremmest kan du ikke binde en IN-liste, det er jeg i hvert fald ret sikker på, at du ikke kan. Jeg formoder, at Hibernate bruger en slags trick, du sætter dit array-indhold ind i en statisk inlist, som Oracle kan bruge.

For det andet, hvis denne forespørgsel udføres med mange forskellige parametre, skal du binde variabler, ellers vil hele databasens ydeevne lide.

Når det er sagt, er der en måde at binde en IN-liste ved hjælp af et 'trick', som Tom Kyte beskriver på sin blog -

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

Koden derinde ser sådan ud:

[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);

Er dybest set der, hvor din forespørgsel går. Bitten ovenfor er tricket, som opdeler den kommaseparerede streng i en liste med værdier. I stedet for at binde en liste til :txt-pladsholderen, skal du konvertere listen til en streng og bare binde den.

Er du sikker på, at forskellen i forespørgselstider ikke skyldes caching eller indlæsningsvariationer på maskinen? Parsing af forespørgslen vil tage lidt tid, men flere sekunder er lang tid.



  1. MySQL-forespørgsel, der beregner delsummer

  2. Få den ældste datetime-værdi med mysql

  3. Sådan installeres Lighttpd med PHP, MariaDB og PhpMyAdmin i Ubuntu

  4. Tilføj Windows-bruger til lokal SQL Server med PowerShell