2017-11-30 4 views
0

Ich habe eine SQL-Abfrage ähnlich wie unten:Wie optimiert man die SQL-Abfrage für Postgres?

select * 
from TableA 
    left outer join TableB on... 
    left outer join TableC on... 
    ... 
    left outer join TableN on... 

where 
    TableA.id in (subquery); 

Diese Abfrage dauert eine lange Zeit auszuführen, und ich überprüfte den Ausführungsplan davon und und fand heraus, dass es die erste tat verbindet und dann die, wo. Die Verknüpfung dauert jedoch lange. Ich führe die gleiche Abfrage gegen Oracle und Oracle hat die Optimierung so, dass es den "wo" -Teil zusammen mit den Joins macht und damit die Zeit viel zu kurz ist.

Meine Frage ist: Wie kann ich die SQL-Abfrage optimieren, so dass Postgres den 'Where' Teil zuerst tun kann?

PS: Ich kann die Unterabfrage nicht in den "von" -Teil mit einem inneren Join hinzufügen, da ich Hibernate verwende und keine Unterabfrage in 'from' -Teil unterstützt.

+1

Überprüfen Sie https://StackOverflow.com/Tags/Postgresql-Performance/info, um zu sehen, was die beantwortbare Postgresql-Performance-Frage im Wesentlichen liefern sollte. – zerkms

+2

'... es Unterabfrage in 'von' Teil nicht unterstützt.Wenn Ihre Werkzeuge nicht funktionieren: Holen Sie sich andere Werkzeuge. – wildplasser

+0

BTW: Ich glaube nicht, dass Hibernate Unterabfragen als Table-Ausdrücke nicht akzeptiert. Vielleicht muss ein Fall von "Unterabfrage einen Alias ​​haben"? – wildplasser

Antwort

0

Wie bereits in den Kommentaren zu Ihrem Beitrag breit diskutiert die Möglichkeit besteht, dass die „FROM (Unterabfrage) tblalias“ Ansatz könnte noch funktionieren, so ist es hier als Pseudo-Code wieder:

select * from (
    select * from TableA where id in (subquery) 
) tblA 
left outer join TableB on... 
left outer join TableC on... 
... 
left outer join TableN on... 

Aber - wer weiß genau, da Pseudocode nicht getestet werden kann ...

Verwandte Themen