Re: Optimize complex join to use where condition before

From: Sebastian Hennebrueder <usenet(at)laliluna(dot)de>
To: pgsql-performance(at)postgresql(dot)org
Subject: Re: Optimize complex join to use where condition before
Date: 2005-05-13 02:14:41
Message-ID: 42840D91.4000400@laliluna.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message Sebastian Hennebrueder 2005-05-13 02:45:50 Re: Optimize complex join to use where condition before
Previous Message David Teran 2005-05-12 22:38:22 Re: AND OR combination: index not being used