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
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 |