Re: Unions and where optimisation - Mailing list pgsql-performance

From Michael Paesold
Subject Re: Unions and where optimisation
Date
Msg-id 013001c2b72d$658ee4b0$3201a8c0@beeblebrox
Whole thread Raw
In response to Unions and where optimisation  (Boris Klug <boris.klug@control.de>)
Responses Re: Unions and where optimisation
List pgsql-performance
Boris Klug <boris.klug@control.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


pgsql-performance by date:

Previous
From: "enediel"
Date:
Subject: postgresql in cluster of servers
Next
From: Boris Klug
Date:
Subject: Re: Unions and where optimisation