Hibernate/JPA Query Optimierung

Ich habe jetzt erst gesehen, dass dort ein Subselect im From steht (die Query ist etwas unübersichtlich :wink: ).
Wie sieht die Methode im Repository aus? Ist sie speziell annotiert? Oder ist es nur ein magischer Name?

Edit: das ist die find(id)-Methode, oder?

@cmrudolph siehe erster Post :wink:
Mittlerweile habe ich eine Query Annotation dran die das gleiche macht

Oh, sorry.

Das gleiche im Sinne von „das langsame Statement“ oder „das schnelle Statement“?

Ich habe zur besseren Lesbarkeit die Queries mal gekürzt:
Langsam:
[sql]select abstractme0_.* from (
select * from message_params_aos union
select * from message_params_ios union
select * from message_params_wos
) abstractme0_ left outer join messages message1_ on abstractme0_.message_id=message1_.id where message1_.id=?[/sql]

Schnell:
[sql]select abstractme0_.* from (
select * from message_params_ios iosp WHERE iosp.message_id =253843 union
select * from message_params_aos aosp WHERE aosp.message_id = 253843 union
select * from message_params_wos wp WHERE wp.message_id =253843
) abstractme0_ left outer join messages message1_ on abstractme0_.message_id=message1_.id where message1_.id=253843;[/sql]

Der Grund, weshalb die langsame Query langsam ist, ist, dass dabei 3 Full-Table-Scans gemacht werden müssen. Bei der zweiten Query kann über den Index die richtige Zeile gefunden werden, was in logarithmischer statt linearer Zeit geht. Abgesehen davon wird der Speicher bei der ersten Query mit allen Tabellenzeilen vollgeladen, bei der zweiten Query nicht, weil nur die richtigen Zeilen geladen werden.

Eine Lösung habe ich aber leider auch nicht parat :frowning:

ja leider wird auch nur das olle langsame erzeugt

jo ist klar warum das schneller ist :wink:

Sonst hättest du die Optimierung ja auch nicht gemacht :wink:

In der „schnellen“ Query ist der Join und damit die ganze äußere Query übrigens auch überflüssig (die Aliase müsste man in den Subqueries dann natürlich anpassen). Das Problem ist wohl, dass nicht erkannt wird, dass der Join nicht erforderlich ist, sondern nur die „inneren“ Tabellen abgefragt werden müssen.

ich habs jetzt damit gelöst dass ich 3 einzelne Querys los schicke, nicht optimal aber schnell und einfache Lösung