Re: Probleme mit sehr langsamen Left Outer Join

From: Thomas Markus <t(dot)markus(at)proventis(dot)net>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: Probleme mit sehr langsamen Left Outer Join
Date: 2016-03-02 07:10:53
Message-ID: 56D691FD.4070006@proventis.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Moins,

vlt übersehe ich ja was aber die function func1 kann man doch zu einer
einzigen query zusammenfassen.
als Inhalt reicht doch:

return query select string_agg(e1::text, chr(10)) AS e from schema2.ce1
where rid = id and cid = code;

Das count(*) und das if Konstrukt sowie das group by ist doch gar nicht
notwendig. Das string_agg bildet das von allein ab.

Somit sind die functions an sich nicht notwendig. Ich würd mal testen ob
Subqueries im select der view nicht schneller sind.

Also

CREATE OR REPLACE VIEW schema1.view1 AS
SELECT <c.columns>,
<eci.columns>,
(select string_agg(e1::text, chr(10)) AS e from schema2.ce1 a1
where e1.rid = eci.rid and e1.cid = eci.cid) as p1,
schema1.func2(eci.rid, eci.cid) AS p2,
schema1.func3(eci.rid, eci.cid) AS p3,
<c. columns>,
<eci. columns>
FROM schema2.c2 c,
schema1.e1 eci
WHERE c.c2id::text = eci.c2id::text AND c.r1 = eci.r1;

Gruss
Thomas

Am 26.02.2016 um 17:57 schrieb Robert J. Rotter:
> Hallo,
>
> ich benötige mal einen Tipp von der Postgres Community:
>
> Ich habe ein Query, das von einer Applikation abgesetzt wird was sehr,
> sehr lange dauert.
> Wohl mehrere Stunden, ich habe es nicht zu Ende laufen lassen.
>
> Die Query sieht wie folgt aus (Schema-, Tabellen- und Spaltennamen habe
> ich abgeändert):
>
> select <diverse spalten> from schema1.table1 cr
> left outer join
> schema1.view1 co on cr.c_id = co.cId
> where name = 'name1';
>
> wobei der view1 die folgende Form besitzt:
>
> CREATE OR REPLACE VIEW schema1.view1 AS
> SELECT <c.columns>,
> <eci.columns>,
> schema1.func1(eci.rid, eci.cid) AS p1,
> schema1.func2(eci.rid, eci.cid) AS p2,
> schema1.func3(eci.rid, eci.cid) AS p3,
> <c. columns>,
> <eci. columns>
> FROM schema2.c2 c,
> schema1.e1 eci
> WHERE c.c2id::text = eci.c2id::text AND c.r1 = eci.r1;
>
> Die Funktionen sind alle ähnlich, fragen nur unterschiedliche Tabellen
> über den pk ab:
>
> CREATE OR REPLACE FUNCTION schema1.func1(id integer, code character
> varying)
> RETURNS SETOF text AS
> $BODY$
> declare numberOfRows int4;
> begin
> numberOfRows := (select count(*) from schema2.ce1 where rid = id
> and cid = code);
> if (numberOfRows = 1) then
> return query select e1::text as e1 from schema2.ce1 where rid
> = id and cid = code;
> end if;
> if (numberOfRows > 1) then
> return query select string_agg(e1::text, chr(10)) AS e from
> schema2.ce1 where rid = id and cid = code group by rid, cid;
> end if;
> if (numberOfRows = 0) then
> return query (select null::text as e);
> end if;
> end;
> $BODY$
>
> Folgender Query Plan kommt dabei raus:
>
> QUERY PLAN
> --------------------------------------------------------------------------------------------------------------------------
> Hash Right Join (cost=40591.59..69079304.13 rows=1 width=302)
> Hash Cond: (eci.cid = cr.cid)
> -> Merge Join (cost=40583.28..26603909.55 rows=3089119000 width=157)
> Merge Cond: (((c.cid)::text = (eci.cid)::text) AND (c.rid =
> eci.rid))
> -> Index Scan using pk_c on c2 c (cost=0.56..4190454.15
> rows=38920217 width=132)
> -> Index Scan using pk_e1 on e1 eci (cost=0.56..2702272.47
> rows=38828501 width=40)
> -> Hash (cost=8.30..8.30 rows=1 width=4)
> -> Index Only Scan using pk_table1 on table1 cr (cost=0.28..8.30
> rows=1 width=4)
> Index Cond: (name = 'a_name'::text)
> (9 rows)
>
>
> Ich sehe hier schon, daß viele Rows beteiligt sind.
> Jedoch fehlt mir ein wenig der Ansatz, wie ich das beschleunigen kann bzw.
> warum es so langsam ist.
> Kann mir da jemand einen Tip geben?
>
> Danke schonmal.
>
>
>
> Viele Grüße
>
> Robert
>
>
>

--

===================================================================
proventis GmbH | Alte Jakobstraße 83/84 | D-10179 Berlin
Tel +49 30 29 36 399 22 | Fax -50 | t(dot)markus(at)proventis(dot)net
-------------------------------------------------------------------
Geschäftsführer: Norman Frischmuth | Sitz: Berlin
Handelsregister: AG Berlin-Charlottenburg, HRB 82917
-------------------------------------------------------------------
Blue Ant - webbasiertes Multi-Projektmanagement - mehr Infos unter:

Veranstaltungen
http://www.proventis.net/de/blue-ant/veranstaltungen.html

Support
http://www.proventis.net/de/blue-ant/support.html

Blue Ant auf Facebook
http://www.facebook.com/Multi.Projektmanagement.Software.BlueAnt
===================================================================

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Robert J. Rotter 2016-03-02 07:19:26 Re: Probleme mit sehr langsamen Left Outer Join
Previous Message Robert J. Rotter 2016-03-02 06:07:15 Re: Probleme mit sehr langsamen Left Outer Join