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: