Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Dynamische Abfrage mit HibernateCritera API &Oracle - Leistung

Hier gibt es ein paar Dinge. Zunächst einmal können Sie keine IN-Liste binden, zumindest bin ich mir ziemlich sicher, dass Sie dies nicht können. Ich vermute, Hibernate verwendet einen Trick, mit dem Sie Ihren Array-Inhalt in eine statische Inlist einfügen, die Oracle verwenden kann.

Zweitens, wenn diese Abfrage mit vielen verschiedenen Parametern ausgeführt wird, müssen Sie Variablen binden oder die Leistung der gesamten Datenbank wird darunter leiden.

Allerdings gibt es eine Möglichkeit, eine IN-Liste mit einem "Trick" zu binden, den Tom Kyte in seinem Blog beschreibt -

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

Der Code darin sieht so aus:

[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

Der Teil:

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

Ist im Grunde, wohin Ihre Abfrage geht. Das obige Bit ist der Trick, der die kommagetrennte Zeichenfolge in eine Liste von Werten aufteilt. Anstatt eine Liste an den Platzhalter :txt zu binden, müssten Sie die Liste in einen String umwandeln und diesen einfach binden.

Sind Sie sicher, dass der Unterschied in den Abfragezeiten nicht auf Caching oder Lastschwankungen auf dem Computer zurückzuführen ist? Das Analysieren der Abfrage dauert ein wenig, aber mehrere Sekunden sind eine lange Zeit.