Re: Optimize complex join to use where condition before - Mailing list pgsql-performance

From Sebastian Hennebrueder
Subject Re: Optimize complex join to use where condition before
Date
Msg-id 42840D91.4000400@laliluna.de
Whole thread Raw
In response to Optimize complex join to use where condition before join  (Sebastian Hennebrueder <usenet@laliluna.de>)
List pgsql-performance
Solution to my problem.
I added indexes to each foreign_key (there had been some missing). I
will try tomorrow by daylight what influence this had actually. Only the
indexes did not change anything! Even with lower random_page_costs and
higher shared mem.

The big change was the following
I created a view which holds a part of the query. The part is the nested
join I am doing from rpojekt, tkunden_kst, ....
See below

Than I changed my query to include the view which improved the
performance from 3000 to 450 ms which is quite good now.

But I am having two more question
a) ###############
I estimated the theoretical speed a little bit higher.
The query without joining the view takes about 220 ms. A query to the
view with a condition projekt_id in ( x,y,z), beeing x,y,z all the
projekt I got with the first query, takes 32 ms.
So my calculation is
query a 220
query b to view with project in ... 32
= 252 ms
+ some time to add the adequate row from query b to one of the 62 rows
from query a
This sometime seems to be quite high with 200 ms

or alternative
query a 220 ms
for each of the 62 rows a query to the view with project_id = x
220
62*2 ms
= 344 ms + some time to assemble all this.
=> 100 ms for assembling. This is quite a lot or am I wrong

b) ###################
My query does take about 200 ms. Most of the time is taken by the
following part
LEFT JOIN (
    SELECT DISTINCT taufgaben_patches.faufgaben_id
    FROM taufgaben_patches
    ORDER BY taufgaben_patches.faufgaben_id
    ) patchdaten ON taufgaben.fid = patchdaten.faufgaben_id

What I want to achieve is one column in my query beeing null or not null
and indicating if there is a patch which includes the aufgabe (engl.: task)
Is there a better way?

--
Kind Regards / Viele Grüße

Sebastian Hennebrueder

-----
http://www.laliluna.de/tutorials.html
Tutorials for Java, Struts, JavaServer Faces, JSP, Hibernate, EJB and more.

##################

Below you can find
query solution I found
explain analyze of the complete query (my solution)
explain analyze of query a
explain analyze of view with one project_id as condition


explain analyze
SELECT taufgaben.fid AS taufgaben_fid,
taufgaben.fprojekt_id AS    taufgaben_fprojekt_id,
taufgaben.fnummer AS taufgaben_fnummer,
  taufgaben.fbudget AS taufgaben_fbudget,
  taufgaben.ftyp AS taufgaben_ftyp,
    taufgaben.fberechnungsart AS taufgaben_fberechnungsart,
    taufgaben.fverrechnung_extern AS taufgaben_fverrechnung_extern,
    taufgaben.fverrechnungsbasis AS taufgaben_fverrechnungsbasis,
    taufgaben.fstatus AS taufgaben_fstatus, taufgaben.fkurzbeschreibung AS
    taufgaben_fkurzbeschreibung, taufgaben.fansprechpartner AS
    taufgaben_fansprechpartner, taufgaben.fanforderer AS
taufgaben_fanforderer,
    taufgaben.fstandort_id AS taufgaben_fstandort_id,
taufgaben.fwunschtermin
    AS taufgaben_fwunschtermin, taufgaben.fstarttermin AS
    taufgaben_fstarttermin, taufgaben.fgesamtaufwand AS
    taufgaben_fgesamtaufwand, taufgaben.fistaufwand AS
taufgaben_fistaufwand,
    taufgaben.fprio AS taufgaben_fprio, taufgaben.ftester AS
taufgaben_ftester,
    taufgaben.ffaellig AS taufgaben_ffaellig, taufgaben.flevel AS
    taufgaben_flevel, taufgaben.fkategorie AS taufgaben_fkategorie,
    taufgaben.feintragbearbeitung AS taufgaben_feintragbearbeitung,
    taufgaben.fbearbeitungsstatus AS taufgaben_fbearbeitungsstatus,
    taufgaben.fsolllimit AS taufgaben_fsolllimit, taufgaben.fistlimit AS
    taufgaben_fistlimit, taufgaben.fpauschalbetrag AS
    taufgaben_fpauschalbetrag, taufgaben.frechnungslaeufe_id AS
    taufgaben_frechnungslaeufe_id, taufgaben.fzuberechnen AS
    taufgaben_fzuberechnen,
taufgaben.floesungsbeschreibung AS
    taufgaben_floesungsbeschreibung, taufgaben.ffehlerbeschreibung AS
    taufgaben_ffehlerbeschreibung, taufgaben.faufgabenstellung AS
    taufgaben_faufgabenstellung, taufgaben.fkritischeaenderungen AS
    taufgaben_fkritischeaenderungen, taufgaben.fbdeaufgabenersteller_id AS
    taufgaben_fbdeaufgabenersteller_id, taufgaben.fzufaktorieren AS
    taufgaben_fzufaktorieren,
    taufgaben.fisdirty AS taufgaben_fisdirty,
    taufgaben.fnf_kunde_stunden AS taufgaben_fnf_kunde_stunden,
    taufgaben.fzf_kunde_stunden AS taufgaben_fzf_kunde_stunden,
    taufgaben.fbf_kunde_stunden AS taufgaben_fbf_kunde_stunden,
    taufgaben.fnf_kunde_betrag AS taufgaben_fnf_kunde_betrag,
    taufgaben.fzf_kunde_betrag AS taufgaben_fzf_kunde_betrag,
    taufgaben.fbf_kunde_betrag AS taufgaben_fbf_kunde_betrag,
    taufgaben.fgesamt_brutto_stunden AS taufgaben_fgesamt_brutto_stunden,
    taufgaben.fgesamt_brutto_betrag AS taufgaben_fgesamt_brutto_betrag,
    taufgaben.fhinweisgesendet AS taufgaben_fhinweisgesendet,
    taufgaben.fwarnunggesendet AS taufgaben_fwarnunggesendet,
    taufgaben.fnfgesamtaufwand AS
    taufgaben_fnfgesamtaufwand, taufgaben.fnf_netto_stunden AS
    taufgaben_fnf_netto_stunden, taufgaben.fnf_brutto_stunden AS
    taufgaben_fnf_brutto_stunden, taufgaben.fnfhinweisgesendet AS
    taufgaben_fnfhinweisgesendet, taufgaben.fnfwarnunggesendet AS
    taufgaben_fnfwarnunggesendet,
taufgaben.fhatzeiten AS taufgaben_fhatzeiten,
    taufgaben.fnichtpublicrechnungsfaehig AS
    taufgaben_fnichtpublicrechnungsfaehig,
    taufgaben.fnichtpublicrechnungsfaehigbetrag AS
    taufgaben_fnichtpublicrechnungsfaehigbetrag,
taufgaben.fnichtberechenbar AS
    taufgaben_fnichtberechenbar, taufgaben.fnichtberechenbarbetrag AS
    taufgaben_fnichtberechenbarbetrag,
    taufgaben.finternertester AS
    taufgaben_finternertester, taufgaben.finterngetestet AS
    taufgaben_finterngetestet,
taufgaben.fanzahlbearbeiter AS taufgaben_fanzahlbearbeiter,

    patchdaten.faufgaben_id AS pataid
    , vprojekt.*
FROM
taufgaben
LEFT JOIN (
    SELECT DISTINCT taufgaben_patches.faufgaben_id
    FROM taufgaben_patches
    ORDER BY taufgaben_patches.faufgaben_id
    ) patchdaten ON taufgaben.fid = patchdaten.faufgaben_id
left join taufgaben_mitarbeiter am on taufgaben.fid = am.faufgaben_id
join vprojekt on taufgaben.fprojekt_id = vprojekt.tprojekte_fid
where
am.fmitarbeiter_id = 54
and
taufgaben.fbearbeitungsstatus <> 2

;
and got the following:

"Merge Join  (cost=1739.31..1739.38 rows=1 width=2541) (actual
time=438.000..454.000 rows=62 loops=1)"
"  Merge Cond: ("outer".fprojekt_id = "inner".fid)"
"  ->  Sort  (cost=1608.41..1608.43 rows=7 width=1047) (actual
time=235.000..235.000 rows=62 loops=1)"
"        Sort Key: taufgaben.fprojekt_id"
"        ->  Merge Join  (cost=1598.30..1608.31 rows=7 width=1047)
(actual time=172.000..235.000 rows=62 loops=1)"
"              Merge Cond: ("outer".fid = "inner".faufgaben_id)"
"              ->  Merge Left Join  (cost=1490.70..1497.67 rows=1120
width=1047) (actual time=157.000..235.000 rows=1118 loops=1)"
"                    Merge Cond: ("outer".fid = "inner".faufgaben_id)"
"                    ->  Sort  (cost=1211.46..1214.26 rows=1120
width=1043) (actual time=94.000..94.000 rows=1118 loops=1)"
"                          Sort Key: taufgaben.fid"
"                          ->  Seq Scan on taufgaben  (cost=0.00..853.88
rows=1120 width=1043) (actual time=0.000..94.000 rows=1120 loops=1)"
"                                Filter: (fbearbeitungsstatus <> 2)"
"                    ->  Sort  (cost=279.23..279.73 rows=200 width=4)
(actual time=63.000..63.000 rows=4773 loops=1)"
"                          Sort Key: patchdaten.faufgaben_id"
"                          ->  Subquery Scan patchdaten
(cost=0.00..271.59 rows=200 width=4) (actual time=0.000..16.000
rows=4773 loops=1)"
"                                ->  Unique  (cost=0.00..269.59 rows=200
width=4) (actual time=0.000..16.000 rows=4773 loops=1)"
"                                      ->  Index Scan using
idx_aufpa_aufgabeid on taufgaben_patches  (cost=0.00..253.74 rows=6340
width=4) (actual time=0.000..16.000 rows=6340 loops=1)"
"              ->  Sort  (cost=107.60..107.69 rows=35 width=4) (actual
time=0.000..0.000 rows=765 loops=1)"
"                    Sort Key: am.faufgaben_id"
"                    ->  Index Scan using idx_tauf_mit_mitid on
taufgaben_mitarbeiter am  (cost=0.00..106.70 rows=35 width=4) (actual
time=0.000..0.000 rows=765 loops=1)"
"                          Index Cond: (fmitarbeiter_id = 54)"
"  ->  Sort  (cost=130.90..130.91 rows=6 width=1494) (actual
time=203.000..203.000 rows=916 loops=1)"
"        Sort Key: tprojekte.fid"
"        ->  Merge Join  (cost=130.53..130.82 rows=6 width=1494) (actual
time=156.000..203.000 rows=876 loops=1)"
"              Merge Cond: ("outer".fkunden_id = "inner".fid)"
"              ->  Sort  (cost=127.06..127.08 rows=6 width=1455) (actual
time=156.000..156.000 rows=876 loops=1)"
"                    Sort Key: tkunden_kst.fkunden_id"
"                    ->  Merge Join  (cost=126.35..126.99 rows=6
width=1455) (actual time=125.000..156.000 rows=876 loops=1)"
"                          Merge Cond: ("outer".fprojektleiter_id =
"inner".fid)"
"                          ->  Sort  (cost=118.57..118.59 rows=9
width=580) (actual time=109.000..109.000 rows=876 loops=1)"
"                                Sort Key: tprojekte.fprojektleiter_id"
"                                ->  Merge Join  (cost=117.89..118.43
rows=9 width=580) (actual time=62.000..94.000 rows=876 loops=1)"
"                                      Merge Cond:
("outer".fkunden_kst_id = "inner".fid)"
"                                      ->  Sort  (cost=114.61..114.69
rows=31 width=508) (actual time=62.000..62.000 rows=876 loops=1)"
"                                            Sort Key:
tprojekte.fkunden_kst_id"
"                                            ->  Merge Join
(cost=109.11..113.84 rows=31 width=508) (actual time=31.000..62.000
rows=876 loops=1)"
"                                                  Merge Cond:
("outer".fid = "inner".fkostentraeger_id)"
"                                                  ->  Sort
(cost=13.40..13.42 rows=7 width=162) (actual time=0.000..0.000 rows=158
loops=1)"
"                                                        Sort Key:
tkostentraeger.fid"
"                                                        ->  Merge Join
(cost=12.41..13.31 rows=7 width=162) (actual time=0.000..0.000 rows=158
loops=1)"
"                                                              Merge
Cond: ("outer".fid = "inner".fkostenstellen_id)"
"                                                              ->  Sort
(cost=3.06..3.08 rows=7 width=119) (actual time=0.000..0.000 rows=19
loops=1)"
"
Sort Key: tkostenstellen.fid"
"                                                                    ->
Merge Join  (cost=2.76..2.96 rows=7 width=119) (actual time=0.000..0.000
rows=19 loops=1)"
"
Merge Cond: ("outer".fabteilungen_id = "inner".fid)"
"
->  Sort  (cost=1.59..1.64 rows=19 width=55) (actual time=0.000..0.000
rows=19 loops=1)"
"

Sort Key: tkostenstellen.fabteilungen_id"
"

->  Seq Scan on tkostenstellen  (cost=0.00..1.19 rows=19 width=55)
(actual time=0.000..0.000 rows=19 loops=1)"
"
->  Sort  (cost=1.17..1.19 rows=7 width=76) (actual time=0.000..0.000
rows=19 loops=1)"
"

Sort Key: tabteilungen.fid"
"

->  Seq Scan on tabteilungen  (cost=0.00..1.07 rows=7 width=76) (actual
time=0.000..0.000 rows=7 loops=1)"
"                                                              ->  Sort
(cost=9.35..9.74 rows=158 width=55) (actual time=0.000..0.000 rows=158
loops=1)"
"
Sort Key: tkostentraeger.fkostenstellen_id"
"                                                                    ->
Seq Scan on tkostentraeger  (cost=0.00..3.58 rows=158 width=55) (actual
time=0.000..0.000 rows=158 loops=1)"
"                                                  ->  Sort
(cost=95.71..97.90 rows=878 width=354) (actual time=31.000..46.000
rows=877 loops=1)"
"                                                        Sort Key:
tprojekte.fkostentraeger_id"
"                                                        ->  Seq Scan on
tprojekte  (cost=0.00..52.78 rows=878 width=354) (actual
time=0.000..31.000 rows=878 loops=1)"
"                                      ->  Sort  (cost=3.28..3.42
rows=58 width=80) (actual time=0.000..0.000 rows=892 loops=1)"
"                                            Sort Key: tkunden_kst.fid"
"                                            ->  Seq Scan on
tkunden_kst  (cost=0.00..1.58 rows=58 width=80) (actual
time=0.000..0.000 rows=58 loops=1)"
"                          ->  Sort  (cost=7.78..8.05 rows=109
width=883) (actual time=16.000..16.000 rows=950 loops=1)"
"                                Sort Key: tuser.fid"
"                                ->  Seq Scan on tuser  (cost=0.00..4.09
rows=109 width=883) (actual time=0.000..0.000 rows=109 loops=1)"
"              ->  Sort  (cost=3.46..3.56 rows=40 width=51) (actual
time=0.000..0.000 rows=887 loops=1)"
"                    Sort Key: tkunden.fid"
"                    ->  Seq Scan on tkunden  (cost=0.00..2.40 rows=40
width=51) (actual time=0.000..0.000 rows=40 loops=1)"
"Total runtime: 454.000 ms"




CREATE OR REPLACE VIEW "public"."vprojekt"
AS
SELECT tprojekte.fid AS tprojekte_fid, tprojekte.fbezeichnung AS
    tprojekte_fbezeichnung, tprojekte.fprojektnummer AS
    tprojekte_fprojektnummer, tprojekte.fbudget AS tprojekte_fbudget,
    tprojekte.fverrechnung_extern AS tprojekte_fverrechnung_extern,
    tprojekte.fstatus AS tprojekte_fstatus, tprojekte.fkunden_kst_id AS
    tprojekte_fkunden_kst_id, tprojekte.fverrechnungsbasis AS
    tprojekte_fverrechnungsbasis, tprojekte.fberechnungsart AS
    tprojekte_fberechnungsart, tprojekte.fprojekttyp AS
tprojekte_fprojekttyp,
    tprojekte.fkostentraeger_id AS tprojekte_fkostentraeger_id,
    tprojekte.fprojektleiter_id AS tprojekte_fprojektleiter_id,
    tprojekte.fpauschalsatz AS tprojekte_fpauschalsatz,
    tprojekte.frechnungslaeufe_id AS tprojekte_frechnungslaeufe_id,
    tprojekte.fzuberechnen AS tprojekte_fzuberechnen,
tprojekte.faufschlagrel
    AS tprojekte_faufschlagrel, tprojekte.faufschlagabs AS
    tprojekte_faufschlagabs, tprojekte.fbearbeitungsstatus AS
    tprojekte_fbearbeitungsstatus, tprojekte.fzufaktorieren AS
    tprojekte_fzufaktorieren, tprojekte.feurobudget AS
tprojekte_feurobudget,
    tprojekte.fnf_kunde_stunden AS tprojekte_fnf_kunde_stunden,
    tprojekte.fzf_kunde_stunden AS tprojekte_fzf_kunde_stunden,
    tprojekte.fbf_kunde_stunden AS tprojekte_fbf_kunde_stunden,
    tprojekte.fnf_kunde_betrag AS tprojekte_fnf_kunde_betrag,
    tprojekte.fzf_kunde_betrag AS tprojekte_fzf_kunde_betrag,
    tprojekte.fbf_kunde_betrag AS tprojekte_fbf_kunde_betrag,
    tprojekte.fisdirty AS tprojekte_fisdirty,
tprojekte.fgesamt_brutto_betrag
    AS tprojekte_fgesamt_brutto_betrag, tprojekte.fgesamt_brutto_stunden AS
    tprojekte_fgesamt_brutto_stunden, tprojekte.fgesamt_netto_stunden AS
    tprojekte_fgesamt_netto_stunden, tprojekte.fhinweisgesendet AS
    tprojekte_fhinweisgesendet, tprojekte.fwarnunggesendet AS
    tprojekte_fwarnunggesendet, tprojekte.fnfgesamtaufwand AS
    tprojekte_fnfgesamtaufwand, tprojekte.fnf_netto_stunden AS
    tprojekte_fnf_netto_stunden, tprojekte.fnf_brutto_stunden AS
    tprojekte_fnf_brutto_stunden, tprojekte.fnfhinweisgesendet AS
    tprojekte_fnfhinweisgesendet, tprojekte.fnfwarnunggesendet AS
    tprojekte_fnfwarnunggesendet, tprojekte.fhatzeiten AS
tprojekte_fhatzeiten,
    tprojekte.fnichtpublicrechnungsfaehig AS
    tprojekte_fnichtpublicrechnungsfaehig,
    tprojekte.fnichtpublicrechnungsfaehigbetrag AS
    tprojekte_fnichtpublicrechnungsfaehigbetrag,
tprojekte.fnichtberechenbar AS
    tprojekte_fnichtberechenbar, tprojekte.fnichtberechenbarbetrag AS
    tprojekte_fnichtberechenbarbetrag, tuser.fusername AS tuser_fusername,
    tuser.fpassword AS tuser_fpassword, tuser.fvorname AS tuser_fvorname,
    tuser.fnachname AS tuser_fnachname, tuser.fismitarbeiter AS
    tuser_fismitarbeiter, tuser.flevel AS tuser_flevel, tuser.fkuerzel AS
    tuser_fkuerzel, tuser.femailadresse AS tuser_femailadresse,
    tkunden_kst.fbezeichnung AS tkunden_kst_name, tkunden.fname AS
    tkunden_name, tabteilungen.fname AS tabteilungen_fname,
    tkostenstellen.fnummer AS tkostenstellen_fnummer,
tkostentraeger.fnummer AS
    tkostentraeger_fnummer
FROM ((((((tprojekte JOIN tuser ON ((tprojekte.fprojektleiter_id =
tuser.fid)))
    JOIN tkunden_kst ON ((tprojekte.fkunden_kst_id = tkunden_kst.fid))) JOIN
    tkunden ON ((tkunden_kst.fkunden_id = tkunden.fid))) JOIN
tkostentraeger ON
    ((tprojekte.fkostentraeger_id = tkostentraeger.fid))) JOIN
tkostenstellen
    ON ((tkostentraeger.fkostenstellen_id = tkostenstellen.fid))) JOIN
    tabteilungen ON ((tkostenstellen.fabteilungen_id = tabteilungen.fid)));




query a

"Merge Join  (cost=1598.30..1608.31 rows=7 width=1047) (actual
time=140.000..218.000 rows=62 loops=1)"
"  Merge Cond: ("outer".fid = "inner".faufgaben_id)"
"  ->  Merge Left Join  (cost=1490.70..1497.67 rows=1120 width=1047)
(actual time=140.000..218.000 rows=1118 loops=1)"
"        Merge Cond: ("outer".fid = "inner".faufgaben_id)"
"        ->  Sort  (cost=1211.46..1214.26 rows=1120 width=1043) (actual
time=78.000..78.000 rows=1118 loops=1)"
"              Sort Key: taufgaben.fid"
"              ->  Seq Scan on taufgaben  (cost=0.00..853.88 rows=1120
width=1043) (actual time=0.000..78.000 rows=1120 loops=1)"
"                    Filter: (fbearbeitungsstatus <> 2)"
"        ->  Sort  (cost=279.23..279.73 rows=200 width=4) (actual
time=62.000..62.000 rows=4773 loops=1)"
"              Sort Key: patchdaten.faufgaben_id"
"              ->  Subquery Scan patchdaten  (cost=0.00..271.59 rows=200
width=4) (actual time=0.000..32.000 rows=4773 loops=1)"
"                    ->  Unique  (cost=0.00..269.59 rows=200 width=4)
(actual time=0.000..16.000 rows=4773 loops=1)"
"                          ->  Index Scan using idx_aufpa_aufgabeid on
taufgaben_patches  (cost=0.00..253.74 rows=6340 width=4) (actual
time=0.000..0.000 rows=6340 loops=1)"
"  ->  Sort  (cost=107.60..107.69 rows=35 width=4) (actual
time=0.000..0.000 rows=765 loops=1)"
"        Sort Key: am.faufgaben_id"
"        ->  Index Scan using idx_tauf_mit_mitid on
taufgaben_mitarbeiter am  (cost=0.00..106.70 rows=35 width=4) (actual
time=0.000..0.000 rows=765 loops=1)"
"              Index Cond: (fmitarbeiter_id = 54)"
"Total runtime: 218.000 ms"



explain analyze
SELECT taufgaben.fid AS taufgaben_fid,
taufgaben.fprojekt_id AS    taufgaben_fprojekt_id,
taufgaben.fnummer AS taufgaben_fnummer,
   taufgaben.fbudget AS taufgaben_fbudget,
   taufgaben.ftyp AS taufgaben_ftyp,
     taufgaben.fberechnungsart AS taufgaben_fberechnungsart,
     taufgaben.fverrechnung_extern AS taufgaben_fverrechnung_extern,
     taufgaben.fverrechnungsbasis AS taufgaben_fverrechnungsbasis,
     taufgaben.fstatus AS taufgaben_fstatus, taufgaben.fkurzbeschreibung AS
     taufgaben_fkurzbeschreibung, taufgaben.fansprechpartner AS
     taufgaben_fansprechpartner, taufgaben.fanforderer AS
taufgaben_fanforderer,
     taufgaben.fstandort_id AS taufgaben_fstandort_id,
taufgaben.fwunschtermin
     AS taufgaben_fwunschtermin, taufgaben.fstarttermin AS
     taufgaben_fstarttermin, taufgaben.fgesamtaufwand AS
     taufgaben_fgesamtaufwand, taufgaben.fistaufwand AS
taufgaben_fistaufwand,
     taufgaben.fprio AS taufgaben_fprio, taufgaben.ftester AS
taufgaben_ftester,
     taufgaben.ffaellig AS taufgaben_ffaellig, taufgaben.flevel AS
     taufgaben_flevel, taufgaben.fkategorie AS taufgaben_fkategorie,
     taufgaben.feintragbearbeitung AS taufgaben_feintragbearbeitung,
     taufgaben.fbearbeitungsstatus AS taufgaben_fbearbeitungsstatus,
     taufgaben.fsolllimit AS taufgaben_fsolllimit, taufgaben.fistlimit AS
     taufgaben_fistlimit, taufgaben.fpauschalbetrag AS
     taufgaben_fpauschalbetrag, taufgaben.frechnungslaeufe_id AS
     taufgaben_frechnungslaeufe_id, taufgaben.fzuberechnen AS
     taufgaben_fzuberechnen,
taufgaben.floesungsbeschreibung AS
     taufgaben_floesungsbeschreibung, taufgaben.ffehlerbeschreibung AS
     taufgaben_ffehlerbeschreibung, taufgaben.faufgabenstellung AS
     taufgaben_faufgabenstellung, taufgaben.fkritischeaenderungen AS
     taufgaben_fkritischeaenderungen, taufgaben.fbdeaufgabenersteller_id AS
     taufgaben_fbdeaufgabenersteller_id, taufgaben.fzufaktorieren AS
     taufgaben_fzufaktorieren,
     taufgaben.fisdirty AS taufgaben_fisdirty,
     taufgaben.fnf_kunde_stunden AS taufgaben_fnf_kunde_stunden,
     taufgaben.fzf_kunde_stunden AS taufgaben_fzf_kunde_stunden,
     taufgaben.fbf_kunde_stunden AS taufgaben_fbf_kunde_stunden,
     taufgaben.fnf_kunde_betrag AS taufgaben_fnf_kunde_betrag,
     taufgaben.fzf_kunde_betrag AS taufgaben_fzf_kunde_betrag,
     taufgaben.fbf_kunde_betrag AS taufgaben_fbf_kunde_betrag,
     taufgaben.fgesamt_brutto_stunden AS taufgaben_fgesamt_brutto_stunden,
     taufgaben.fgesamt_brutto_betrag AS taufgaben_fgesamt_brutto_betrag,
     taufgaben.fhinweisgesendet AS taufgaben_fhinweisgesendet,
     taufgaben.fwarnunggesendet AS taufgaben_fwarnunggesendet,
     taufgaben.fnfgesamtaufwand AS
     taufgaben_fnfgesamtaufwand, taufgaben.fnf_netto_stunden AS
     taufgaben_fnf_netto_stunden, taufgaben.fnf_brutto_stunden AS
     taufgaben_fnf_brutto_stunden, taufgaben.fnfhinweisgesendet AS
     taufgaben_fnfhinweisgesendet, taufgaben.fnfwarnunggesendet AS
     taufgaben_fnfwarnunggesendet,
taufgaben.fhatzeiten AS taufgaben_fhatzeiten,
     taufgaben.fnichtpublicrechnungsfaehig AS
     taufgaben_fnichtpublicrechnungsfaehig,
     taufgaben.fnichtpublicrechnungsfaehigbetrag AS
     taufgaben_fnichtpublicrechnungsfaehigbetrag,
taufgaben.fnichtberechenbar AS
     taufgaben_fnichtberechenbar, taufgaben.fnichtberechenbarbetrag AS
     taufgaben_fnichtberechenbarbetrag,
     taufgaben.finternertester AS
     taufgaben_finternertester, taufgaben.finterngetestet AS
     taufgaben_finterngetestet,
taufgaben.fanzahlbearbeiter AS taufgaben_fanzahlbearbeiter
,    patchdaten.faufgaben_id AS pataid
  --   , vprojekt.*
FROM
taufgaben
LEFT JOIN (
     SELECT DISTINCT taufgaben_patches.faufgaben_id
     FROM taufgaben_patches
     ) patchdaten ON taufgaben.fid = patchdaten.faufgaben_id

left join taufgaben_mitarbeiter am on taufgaben.fid = am.faufgaben_id

--join vprojekt on taufgaben.fprojekt_id = vprojekt.tprojekte_fid
where
am.fmitarbeiter_id = 54
and
taufgaben.fbearbeitungsstatus <> 2

;



##########################################################

query b using the select from the view

"Nested Loop  (cost=0.00..24.44 rows=1 width=1494) (actual
time=0.000..0.000 rows=1 loops=1)"
"  Join Filter: ("outer".fprojektleiter_id = "inner".fid)"
"  ->  Nested Loop  (cost=0.00..18.98 rows=1 width=619) (actual
time=0.000..0.000 rows=1 loops=1)"
"        Join Filter: ("outer".fabteilungen_id = "inner".fid)"
"        ->  Nested Loop  (cost=0.00..17.83 rows=1 width=555) (actual
time=0.000..0.000 rows=1 loops=1)"
"              Join Filter: ("outer".fkostenstellen_id = "inner".fid)"
"              ->  Nested Loop  (cost=0.00..16.40 rows=1 width=512)
(actual time=0.000..0.000 rows=1 loops=1)"
"                    ->  Nested Loop  (cost=0.00..11.17 rows=1
width=465) (actual time=0.000..0.000 rows=1 loops=1)"
"                          Join Filter: ("outer".fkunden_id = "inner".fid)"
"                          ->  Nested Loop  (cost=0.00..8.27 rows=1
width=426) (actual time=0.000..0.000 rows=1 loops=1)"
"                                Join Filter: ("outer".fkunden_kst_id =
"inner".fid)"
"                                ->  Index Scan using aaaaaprojekte_pk
on tprojekte  (cost=0.00..5.97 rows=1 width=354) (actual
time=0.000..0.000 rows=1 loops=1)"
"                                      Index Cond: (fid = 2153)"
"                                ->  Seq Scan on tkunden_kst
(cost=0.00..1.58 rows=58 width=80) (actual time=0.000..0.000 rows=58
loops=1)"
"                          ->  Seq Scan on tkunden  (cost=0.00..2.40
rows=40 width=51) (actual time=0.000..0.000 rows=40 loops=1)"
"                    ->  Index Scan using aaaaakostentraeger_pk on
tkostentraeger  (cost=0.00..5.21 rows=1 width=55) (actual
time=0.000..0.000 rows=1 loops=1)"
"                          Index Cond: ("outer".fkostentraeger_id =
tkostentraeger.fid)"
"              ->  Seq Scan on tkostenstellen  (cost=0.00..1.19 rows=19
width=55) (actual time=0.000..0.000 rows=19 loops=1)"
"        ->  Seq Scan on tabteilungen  (cost=0.00..1.07 rows=7 width=76)
(actual time=0.000..0.000 rows=7 loops=1)"
"  ->  Seq Scan on tuser  (cost=0.00..4.09 rows=109 width=883) (actual
time=0.000..0.000 rows=109 loops=1)"
"Total runtime: 0.000 ms"



explain analyze
SELECT tprojekte.fid AS tprojekte_fid, tprojekte.fbezeichnung AS
     tprojekte_fbezeichnung, tprojekte.fprojektnummer AS
     tprojekte_fprojektnummer, tprojekte.fbudget AS tprojekte_fbudget,
     tprojekte.fverrechnung_extern AS tprojekte_fverrechnung_extern,
     tprojekte.fstatus AS tprojekte_fstatus, tprojekte.fkunden_kst_id AS
     tprojekte_fkunden_kst_id, tprojekte.fverrechnungsbasis AS
     tprojekte_fverrechnungsbasis, tprojekte.fberechnungsart AS
     tprojekte_fberechnungsart, tprojekte.fprojekttyp AS
tprojekte_fprojekttyp,
     tprojekte.fkostentraeger_id AS tprojekte_fkostentraeger_id,
     tprojekte.fprojektleiter_id AS tprojekte_fprojektleiter_id,
     tprojekte.fpauschalsatz AS tprojekte_fpauschalsatz,
     tprojekte.frechnungslaeufe_id AS tprojekte_frechnungslaeufe_id,
     tprojekte.fzuberechnen AS tprojekte_fzuberechnen,
tprojekte.faufschlagrel
     AS tprojekte_faufschlagrel, tprojekte.faufschlagabs AS
     tprojekte_faufschlagabs, tprojekte.fbearbeitungsstatus AS
     tprojekte_fbearbeitungsstatus, tprojekte.fzufaktorieren AS
     tprojekte_fzufaktorieren, tprojekte.feurobudget AS
tprojekte_feurobudget,
     tprojekte.fnf_kunde_stunden AS tprojekte_fnf_kunde_stunden,
     tprojekte.fzf_kunde_stunden AS tprojekte_fzf_kunde_stunden,
     tprojekte.fbf_kunde_stunden AS tprojekte_fbf_kunde_stunden,
     tprojekte.fnf_kunde_betrag AS tprojekte_fnf_kunde_betrag,
     tprojekte.fzf_kunde_betrag AS tprojekte_fzf_kunde_betrag,
     tprojekte.fbf_kunde_betrag AS tprojekte_fbf_kunde_betrag,
     tprojekte.fisdirty AS tprojekte_fisdirty,
tprojekte.fgesamt_brutto_betrag
     AS tprojekte_fgesamt_brutto_betrag, tprojekte.fgesamt_brutto_stunden AS
     tprojekte_fgesamt_brutto_stunden, tprojekte.fgesamt_netto_stunden AS
     tprojekte_fgesamt_netto_stunden, tprojekte.fhinweisgesendet AS
     tprojekte_fhinweisgesendet, tprojekte.fwarnunggesendet AS
     tprojekte_fwarnunggesendet, tprojekte.fnfgesamtaufwand AS
     tprojekte_fnfgesamtaufwand, tprojekte.fnf_netto_stunden AS
     tprojekte_fnf_netto_stunden, tprojekte.fnf_brutto_stunden AS
     tprojekte_fnf_brutto_stunden, tprojekte.fnfhinweisgesendet AS
     tprojekte_fnfhinweisgesendet, tprojekte.fnfwarnunggesendet AS
     tprojekte_fnfwarnunggesendet, tprojekte.fhatzeiten AS
tprojekte_fhatzeiten,
     tprojekte.fnichtpublicrechnungsfaehig AS
     tprojekte_fnichtpublicrechnungsfaehig,
     tprojekte.fnichtpublicrechnungsfaehigbetrag AS
     tprojekte_fnichtpublicrechnungsfaehigbetrag,
tprojekte.fnichtberechenbar AS
     tprojekte_fnichtberechenbar, tprojekte.fnichtberechenbarbetrag AS
     tprojekte_fnichtberechenbarbetrag, tuser.fusername AS tuser_fusername,
     tuser.fpassword AS tuser_fpassword, tuser.fvorname AS tuser_fvorname,
     tuser.fnachname AS tuser_fnachname, tuser.fismitarbeiter AS
     tuser_fismitarbeiter, tuser.flevel AS tuser_flevel, tuser.fkuerzel AS
     tuser_fkuerzel, tuser.femailadresse AS tuser_femailadresse,
     tkunden_kst.fbezeichnung AS tkunden_kst_name, tkunden.fname AS
     tkunden_name, tabteilungen.fname AS tabteilungen_fname,
     tkostenstellen.fnummer AS tkostenstellen_fnummer,
tkostentraeger.fnummer AS
     tkostentraeger_fnummer
FROM ((((((tprojekte JOIN tuser ON ((tprojekte.fprojektleiter_id =
tuser.fid)))
     JOIN tkunden_kst ON ((tprojekte.fkunden_kst_id = tkunden_kst.fid)))
JOIN
     tkunden ON ((tkunden_kst.fkunden_id = tkunden.fid))) JOIN
tkostentraeger ON
     ((tprojekte.fkostentraeger_id = tkostentraeger.fid))) JOIN
tkostenstellen
     ON ((tkostentraeger.fkostenstellen_id = tkostenstellen.fid))) JOIN
     tabteilungen ON ((tkostenstellen.fabteilungen_id = tabteilungen.fid)))

where tprojekte.fid = 2153


pgsql-performance by date:

Previous
From: David Teran
Date:
Subject: Re: AND OR combination: index not being used
Next
From: Sebastian Hennebrueder
Date:
Subject: Re: Optimize complex join to use where condition before