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