Re: Unions and where optimisation

From: "Michael Paesold" <mpaesold(at)gmx(dot)at>
To: "Boris Klug" <boris(dot)klug(at)control(dot)de>, "Tomasz Myrta" <jasiek(at)klaster(dot)net>, "Hannu Krosing" <hannu(at)tm(dot)ee>
Cc: <pgsql-performance(at)postgresql(dot)org>
Subject: Re: Unions and where optimisation
Date: 2003-01-08 15:48:27
Message-ID: 013001c2b72d$658ee4b0$3201a8c0@beeblebrox
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Boris Klug <boris(dot)klug(at)control(dot)de> wrote:

> > Hannu, does it work?
> > Few months ago I lost some time trying to create this kind of query and
> > I always got error, that subselect doesn't knows anything about upper
> > (outer?) table.
>
> It does not work on my PostgreSQL 7.2.x
>
> Get the same error like you: "relation rk does not exist"
>
> Also the disadvantage of this solution is that the speed up is bound to
> queries for the ordernr. If a statement has a where clause e.g. for a
> timestamp, the view is still slow.
>
> Does PostgreSQL not know how to move where clause inside each select in a
> union?

Hi Boris,

As far as I know, this has first been "fixed" in 7.3. I think it was Tom who
improved the optimizer to push the where clause into the selects of a union
view. I've done a test...

create view test as
select updated, invoice_id from invoice
union all
select updated, invoice_id from inv2
union all
select updated, invoice_id from inv3;

... and it seems to work (postgresql 7.3 here):

billing=# explain select * from test where invoice_id = 111000;
QUERY PLAN
----------------------------------------------------------------------------
----------------
Subquery Scan test (cost=0.00..413.24 rows=114 width=12)
-> Append (cost=0.00..413.24 rows=114 width=12)
-> Subquery Scan "*SELECT* 1" (cost=0.00..6.00 rows=1 width=12)
-> Index Scan using pk_invoice on invoice (cost=0.00..6.00
rows=1 width=12)
Index Cond: (invoice_id = 111000)
-> Subquery Scan "*SELECT* 2" (cost=0.00..203.62 rows=57
width=12)
-> Index Scan using idx_inv2 on inv2 (cost=0.00..203.62
rows=57 width=12)
Index Cond: (invoice_id = 111000)
-> Subquery Scan "*SELECT* 3" (cost=0.00..203.62 rows=57
width=12)
-> Index Scan using idx_inv3 on inv3 (cost=0.00..203.62
rows=57 width=12)
Index Cond: (invoice_id = 111000)
(11 rows)

I hope this is helps. Can you upgrade to 7.3.1? I really think the upgrade
is worth the effort.

Best Regards,
Michael Paesold

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Hannu Krosing 2003-01-08 16:02:15 Re: Unions and where optimisation
Previous Message Tomasz Myrta 2003-01-08 14:40:43 Re: Unions and where optimisation